Python SQLAlchemy反射:如何将数据更新到反射表中?

Python SQLAlchemy反射:如何将数据更新到反射表中?,python,sqlalchemy,Python,Sqlalchemy,使用SQLAlchemy反射,如何将数据插入/更新到表中 我刚刚了解了如何使用SQLAlchemy反射查询特定的表。我已经完成了数据的制作,现在我想保存到数据库中,但我不知道如何保存它。这是我到目前为止所做的尝试 class Member(Base): __table__ = Table('member', Metadata, autoload=True) def set_password(self, member_id, password): data = No

使用SQLAlchemy反射,如何将数据插入/更新到表中

我刚刚了解了如何使用SQLAlchemy反射查询特定的表。我已经完成了数据的制作,现在我想保存到数据库中,但我不知道如何保存它。这是我到目前为止所做的尝试

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 
回溯(最近一次呼叫最后一次):
文件“/home/workspace/testmod/src/tester.py”,第44行,在
m、 设置密码(m,1,“密码”)
文件“/home/workspace/testmod/src/tester.py”,第36行,在set\u密码中
对于session.add中的数据(self.\uuuuu表\uuuuuu.c.id、self.\uuuuuuu表\uuuuuuu.c.password):
文件“/usr/local/lib/python3.2/dist packages/SQLAlchemy-0.8.0b2-py3.2.egg/SQLAlchemy/orm/session.py”,第1363行,添加
如果对事件发出警告和自我警告:
文件“/usr/local/lib/python3.2/dist packages/SQLAlchemy-0.8.0b2-py3.2.egg/SQLAlchemy/sql/expression.py”,第1932行,在__
raise TypeError(“未定义此子句的布尔值”)
TypeError:未定义此子句的布尔值

那么,我们如何更新/插入反射表呢?

您使用session.add()的方式完全错误-它没有返回值,并且接受映射对象(例如成员实例:
m=Member()
)作为参数,而不是列对象。您发送的第二个参数是一个未公开使用的内部参数,这就是您出错的原因

我强烈建议您仔细阅读,以了解会话和add()方法的用法

您要查找的特定用法不一定很清楚,但您为
set\u password()
提供的调用签名表明您希望将具有给定成员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")
如果您真的只想为这一个值发出更新,而不再需要刚才加载的成员对象,则可以使用直接更新()更高效地完成:


它起作用了。谢谢你的解释。老实说,您在这里解释的内容在文档中是不可用的(除非您证明我错了)。我已经阅读了文档,对标准SQLAlchemy ORM非常熟悉。但是SQLAlchemy反射感觉像一个全新的怪物。我从来没有想到我需要类方法。也许作为一名高级Python开发人员,你会发现这一点,但作为一名新手,很难将这两个概念结合起来。像你这样的例子可以让人们更快地了解情况。在这里之后,我将为新手提供一个关于SQLAlchemy Reflection的教程classmethod更像是一个OO编程的东西,我指的是Session.add()是如何工作的。我知道你可以在文件里找到!无论您如何获得表对象,会话都以相同的方式工作。
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)