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() 的方式完全错误-它没有返回值,并且接受映射对象(例如 Member 实例:)m = Member()作为参数,而不是 Column 对象。您发送的第二个参数是未公开使用的内部参数,这就是您收到错误的原因。

我强烈建议您仔细阅读本教程,以了解如何使用 Session 和 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")

如果您真的只想为那个值发出 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 回答