DBから行を取得しようとしていて、その行を変更してもう一度保存しています。私はRowProxyオブジェクトを変更しようとしていますので、SQLAlchemyのSqlAlchemyで行を更新するORM
私のコード
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()
を使用して
すべては残念ながら、それは、動作しません。どのようにしてSqlAlchemy ORMの方法で(行のロード、変更、保存(更新))したいのですか?
一目注:あなたが変更するためのセッションにオブジェクトを追加しないでください。新しい行を作成するときに追加します。通常は、プロキシオブジェクトを変更してセッションオブジェクトに対してコミットするだけです。また、ORMを実際に使用する場合は、通常SQLでクエリを作成せずにexecuteメソッドを使用します。クエリジェネレータを使用します。 – Keith
彼はRowProxyオブジェクトを変更するときにAttributeErrorを得たと述べています。なぜあなたはそれが働くことを期待していますか? –