1

SQLAlchemy リフレクションを使用して、テーブルにデータを挿入/更新するにはどうすればよいですか?

ここで詳しく説明されているように、SQLAlchemy Reflection を使用して特定のテーブルをクエリする方法を理解したところです。データの操作が完了したので、データベースに保存したいのですが、その方法がわかりません。これが私がこれまでに試したことです。

class Member(Base):
    __table__ = Table('member', Metadata, autoload=True)
    def set_password(self, member_id, password):
        data = None
        for data in session.add( self.__table__.c.member_id, self.__table__.c.parking_slot_id):            
            self.__table__.c.id = member_id
            self.__table__.c.password = password
            session.flush()   

それは失敗します:

Traceback (most recent call last):
  File "/home/workspace/testmod/src/tester.py", line 44, in <module>
    m.set_password(m, 1, "password")
  File "/home/workspace/testmod/src/tester.py", line 36, in set_password
    for data in session.add(self.__table__.c.id, self.__table__.c.password):            
  File "/usr/local/lib/python3.2/dist-packages/SQLAlchemy-0.8.0b2-py3.2.egg/sqlalchemy/orm/session.py", line 1363, in add
    if _warn and self._warn_on_events:
  File "/usr/local/lib/python3.2/dist-packages/SQLAlchemy-0.8.0b2-py3.2.egg/sqlalchemy/sql/expression.py", line 1932, in __bool__
    raise TypeError("Boolean value of this clause is not defined")
TypeError: Boolean value of this clause is not defined 

では、反映されたテーブルを更新/挿入するにはどうすればよいでしょうか?

4

1 に答える 1

3

session.add() の使用方法は完全に間違っています。戻り値がなくm = Member()、Column オブジェクトではなく、マップされたオブジェクト ( Member インスタンスなど) を引数として受け入れます。送信している 2 番目の引数は、公開されていない内部引数であるため、エラーが発生しています。

セッションと add() メソッドの使用方法を理解するために、チュートリアルをよく読むことを強くお勧めします。

探している特定の使用法は必ずしも明確ではありませんが、提供している呼び出し署名はset_password()、特定の member_id を持つ行を特定のパスワードに変更したいことを示しています。これは、クラスレベルにあるルックアップ メソッドであることを意味します。

class Member(Base):
    __table__ = Table('member', Metadata, autoload=True)

    @classmethod
    def set_password(cls, member_id, password):
        member = session.query(Member).filter_by(member_id=member_id).one()
        member.password = password
        session.flush()

# usage:

Member.set_password(56, "somepassword")

本当にその 1 つの値に対して UPDATE を発行したいだけで、ロードしたばかりの Member オブジェクトがもう必要ない場合は、直接的な update() を使用してより効率的に実行できます。

class Member(Base):
    __table__ = Table('member', Metadata, autoload=True)

    @classmethod
    def set_password(cls, member_id, password):
        session.query(Member).filter_by(member_id=member_id).\
                    update({'password':password}, synchronize_session=False)
于 2013-03-08T20:49:57.627 に答える