我是sqlalchemy的新手,只知道基本的sqlalachemy知识。
现在我正在编写一些Python代码,我需要做的是如下:
有一个User表,一个Group表和一个GroupUser表。为简化问题,请说我已知用户ID为100.现在我想在Group表中插入一个新组,然后返回组ID,然后将(group_id,user_id)元组插入GroupUser表。
我可以编写的代码如下:
# Insert the group first.
session = self.DBSession()
new_group = Group(name = 'gname')
session.add(new_group)
session.commit()
# Then query back the new group id
gid = session.query(Group).filter(Group.name == 'gname').first().id
# At last, insert group-user
gu = GroupUser(gid=gid, uid=100)
session.add(gu)
session.commit()
顺便说一下,Group表中的id是autoincrement。
我想知道这个程序是否可以简化?我可以在一次交易中完成这项工作。
答案 0 :(得分:1)
绝对可以简化。首先,最后只需要一个commit()语句。其次,您缺少flush(),它会自动为您提供(最后)插入组的ID。这意味着您不需要在单独的语句中显式查询该ID。您的代码应该类似于:
session = self.DBSession()
new_group = Group(name='gname')
session.add(new_group)
session.flush() # NOTE: this will actually insert the record in the database and set
# new_group.id automatically. The session, however, is not committed yet!
gu = GroupUser(gid=new_group.id, uid=100)
session.add(gu)
session.flush() # not required actually because flush() below will do it for you,
# but explicit is always better than implicit =)
session.commit() # this will finally commit your transaction, i.e. 2 statements above