使用SQLAlchemy反射,如何将数据插入/更新到表中?
我刚刚了解如何使用SQLAlchemy Reflection作为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
那么,我们如何更新/插入反射表?
答案 0 :(得分:3)
你使用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对象,那么使用直接更新()可以更有效地完成它:
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)