【问题标题】:SQLAlchemy Reflection: How do I update data into reflected tables?SQLAlchemy 反射:如何将数据更新到反射表中?
【发布时间】:2013-02-24 03:27:26
【问题描述】:

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

我刚刚了解了如何使用 SQLAlchemy 反射作为detailed out here 查询特定表。完成了数据操作,现在我想保存到数据库中,但我不知道如何保存。这是我迄今为止尝试过的。

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 

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

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

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

    我强烈建议好好阅读tutorial 以了解如何使用 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)
    

    【讨论】:

    • 它的工作。感谢您的解释。老实说,您在此处解释的内容在文档中不可用(除非您证明我错了)。我已经阅读了文档并且对标准的 SQLAlchemy ORM 非常满意。但是 SQLAlchemy Reflection 感觉就像一个全新的怪物。我永远不会猜到我需要类方法。也许作为一名高级 Python 开发人员,可能会明白这一点,但作为新手,很难将两个概念放在一起。像你这样的例子可以让人们更快地掌握速度。在这里之后,我将为 SQLAlchemy 反射的新手准备一个教程
    • classmethod 更像是一种面向对象编程的东西,我指的是 Session.add() 的工作原理。我知道您可以在文档中找到它!无论您如何获得 Table 对象,会话都以相同的方式工作。
    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多