2013-01-13 36 views
8

DB'den bir satır elde etmeye, bu satırı değiştirmeye ve yeniden kaydetmeye çalışıyorum. Ben RowProxy nesneyi değiştirmeye çalışıyorum çünkü sqlalchemySatırda güncelleştirme SqlAlchemy ORM

Benim kod

from sqlalchemy import Column, DateTime, Integer, String, Table, MetaData 
from sqlalchemy.orm import mapper 
from sqlalchemy import create_engine, orm 

metadata = MetaData() 

product = Table('product', metadata, 
    Column('id', Integer, primary_key=True), 
    Column('name', String(1024), nullable=False, unique=True), 

) 

class Product(object): 
    def __init__(self, id, name): 
     self.id = id 
     self.name = name 

mapper(Product, product) 


db = create_engine('sqlite:////' + db_path) 
sm = orm.sessionmaker(bind=db, autoflush=True, autocommit=True, expire_on_commit=True) 
session = orm.scoped_session(sm) 

result = session.execute("select * from product where id = :id", {'id': 1}, mapper=Product) 
prod = result.fetchone() #there are many products in db so query is ok 

prod.name = 'test' #<- here I got AttributeError: 'RowProxy' object has no attribute 'name' 

session .add(prod) 
session .flush() 

kullanarak
Her şey Ne yazık ki, çalışmıyor. SqlAlchemy ORM biçiminde istediğimi (yükleme, değiştirme ve kaydetme (güncelleştirme)) nasıl yapabilirim?

+1

hızlı bir bakış not: değiştirmek için kullanılan bir oturuma nesneler eklemeyin. Yeni bir satır oluştururken eklersiniz. Normal olarak, yalnızca proxy nesnesini değiştirirsiniz, ardından oturum nesnesinde işlem yaparsınız. Ayrıca, ORM'yi gerçekten kullanmak isterseniz, normalde SQL'de bir sorgu oluşturmazsınız ve yürütme yöntemini kullanırsınız. Sorgu jeneratörü kullanın. – Keith

+0

RowProxy nesnesini değiştirirken AttributeError olduğunu söyledi. Neden bunun işe yaramasını bekliyordun? –

cevap

13

Amacınızın, Object-Relational API kullanmak olduğunu varsayalım. Bu yüzden db'deki satırı güncellemek için, tablo kaydından eşlenen nesneyi yükleyerek ve nesnenin özelliğini güncelleyerek bunu yapmanız gerekir.

Lütfen aşağıdaki kod örneğine bakınız. Lütfen yeni eşlenmiş nesne oluşturmaya ve tablodaki ilk kaydı oluşturmaya yönelik kod ekledim, ayrıca kaydı silmek için kodun sonunda yorumlandığını da unutmayın.

from sqlalchemy import Column, DateTime, Integer, String, Table, MetaData 
from sqlalchemy.orm import mapper 
from sqlalchemy import create_engine, orm 

metadata = MetaData() 

product = Table('product', metadata, 
    Column('id', Integer, primary_key=True), 
    Column('name', String(1024), nullable=False, unique=True), 

) 

class Product(object): 
    def __init__(self, id, name): 
     self.id = id 
     self.name = name 
    def __repr__(self): 
     return "%s(%r,%r)" % (self.__class__.name,self.id,self.name) 

mapper(Product, product) 


db = create_engine('sqlite:////temp/test123.db') 
metadata.create_all(db) 

sm = orm.sessionmaker(bind=db, autoflush=True, autocommit=True, expire_on_commit=True) 
session = orm.scoped_session(sm) 

#create new Product record: 
if session.query(Product).filter(Product.id==1).count()==0: 

    new_prod = Product("1","Product1") 
    print "Creating new product: %r" % new_prod 
    session.add(new_prod) 
    session.flush() 
else: 
    print "product with id 1 already exists: %r" % session.query(Product).filter(Product.id==1).one() 

print "loading Product with id=1" 
prod = session.query(Product).filter(Product.id==1).one() 
print "current name: %s" % prod.name 
prod.name = "new name" 

print prod 


prod.name = 'test' 

session.add(prod) 
session.flush() 

print prod 

#session.delete(prod) 
#session.flush() 

PS SQLAlchemy doğrudan da eşleştirilmiş nesneleri yaratmadan tablo kayıtları ile çalışma olanağı sağlar SQL Expression API sağlar. Benim Uygulamada biz verimli şekilde yerleştirirken veya bir sorgu ile binlerce kayıt güncelleme gibi düşük seviyeli db işlemleri gerçekleştirmek için gerektiğinde bazen SQL İfadeler API'sini kullanmak, uygulamaların çoğunda Nesne-İlişki API kullanıyor. SQLAlchemy belgelerine

doğrudan bağlantılar:

+0

ORM'yi kullanmak için tek seçenek mi? Veya SQLAlchemy İfade Dili ile de mümkün mü? –