49

私は SQLAlchemy 初心者です。

宣言モードのユーザー テーブルがあるとします。

class User(Base):
    __tablename__ = 'user'
    id = Column(u'id', Integer(), primary_key=True)
    name = Column(u'name', String(50))

オブジェクトがセッションにロードされていないユーザーの ID がわかっている場合は、そのようなユーザーを次のように更新します。

ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley")
Session.execute(ex)

私は を使うのが嫌いUser.__table__です。

これを行うより良い方法はありますか?

ありがとう!

4

3 に答える 3

64

ORMレベルでの更新機能もあります。トリッキーなケースはまだ処理しませんが、単一行の更新(または一括更新)の些細なケースでは問題なく機能します。すでにロードされているオブジェクトを調べて、それらにも更新を適用します。次のように使用できます。

session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
于 2010-04-13T20:19:19.850 に答える
20

ここでは、モデル/エンティティ/オブジェクトレベルではなく、レベルで作業しています。句レベルは、マップされたオブジェクトよりも低くなります。そして、はい、ある用語を別の用語に変換するために何かをしなければなりません。

オブジェクトレベルにとどまり、次のことを行うこともできます。

session = Session()
u = session.query(User).get(123)
u.name = u"Bob Marley"
session.commit()

ただし、マップされたオブジェクトの構築につながるため、大幅に遅くなります。そして、私はそれがより読みやすいかどうかわかりません。

あなたが提供した例では、私は最も自然で「正しい」解決策を見ています。__table__私は小さな魔法については心配しません。

于 2010-04-13T18:24:07.727 に答える