単純なケース:
考えられる簡単な解決策: からオブジェクトを構築しますkwargs
。RowProxy
これらはオブジェクトに似ているためです。
与えられた:
rowproxy = update(User) \
.values({'name': 'Wayne'}) \
.where(User.id == subquery.as_scalar()) \
.returning() \
.fetchone()
次のことができるかもしれません:
user = User(**dict(rowproxy.items()))
rowproxy.items()
ペアtuples
のリターン; を実際のペアに変換します。と属性名を取ります。key-value
dict(...)
tuples
key-value
User(...)
kwargs
model
より困難なケース:
しかしmodel
、 の 1 つがattribute names
SQL とまったく同じでない場合はどうなるtable
column name
でしょうか。例:
class User(ORMBase):
# etc...
user_id = Column(name='id', etc)
クラスにアンパックしようとするとrowproxy
、User
次の行に沿ってエラーが発生する可能性があります(代わりにTypeError: 'id' is an invalid keyword argument for User
期待しているため)。user_id
今では汚れています:属性から属性へ、またはその逆mapper
に取得する方法については、周りにあるはずです:table
model
kw_map = {a.key: a.class_attribute.name for a in User.__mapper__.attrs}
ここで、a.key
はmodel attribute
(およびkwarg
) であり、a.class_attribute.name
はtable attribute
です。これにより、次のような結果が得られます。
{
"user_id": "id"
}
さて、実際に から返された値を提供したいと思いますrowproxy
。これは、オブジェクトのようなアクセスを許可するだけでなく、dict のようなアクセスも許可します。
kwargs = {a.key: rowproxy[a.class_attribute.name] for a in User.__mapper__.attrs}
そして今、私たちはできる:
user = User(**kwargs)
正誤表:
- 変更がデータベースに永続的に保存されるときと比較して、変更からの長い遅延を防ぐため
session.commit()
に、呼び出しの直後にしたい場合があります。update().returning()
後でする必要はありませんsession.add(user)
- あなたはすでにそのトランザクションupdated()
を必要としていますcommit()
object
は Python のキーワードなので、踏まないようにしてください。これを行うと、非常に奇妙な動作が発生する可能性があります。そのため、名前を に変更しましたrowproxy
。