Python SQLAlchemy after_insert MapperEvent

时间:2013-01-25 19:31:18

标签: python mysql sqlalchemy

所以我是SQLAlchemy的新手,我希望在创建一个新的User对象后默认创建一个Permissions对象。阅读文档似乎是after_insert mapper事件是我应该使用的。问题是在实际提交对象之前调用事件侦听器。

有没有办法让Permissions对象至少放入可能的事务中,或者在实际提交用户对象后要创建的对象列表中。

class Users():
  __tablename__ = 'users'
  user_id = Column(String(36), primary_key=True, nullable=False)
  .......

class Permissions():
  __tablename__ = 'permissions'
  user_id = Column(String(36), ForeignKey('users.user_id'), primary_key=True,
                   nullable=False)
   ..........


@event.listens_for(Users, "after_insert)
def create_permissions(mapper, connection, user):
    connection.execute(Permissions.__table__.insert(user_id=user.user_id))

IntegrityError:(IntegrityError)(1452,'无法添加或更新子行:外键约束失败

理想情况下,我想在Users表上没有数据库触发器的情况下这样做。

2 个答案:

答案 0 :(得分:1)

因此,通过更改我的类定义,并将会话对象附加到每个类,我可以在发出after_insert信号时添加新的Permissions对象。并且正确的提交顺序发生了。

class Users():
  __tablename__ = 'users'
  user_id = Column(String(36), primary_key=True, nullable=False)
  ............

class Permissions():
  __tablename__ = 'permissions'
  user_id = Column(String(36), ForeignKey('users.user_id'), primary_key=True,
                   nullable=False)
   ............


@event.listens_for(Users, "after_insert")
def create_permissions(mapper, connection, user):
    user.session.add(Permissions(user_id=user.user_id))

答案 1 :(得分:1)

您无需将会话附加到ORM对象。只需使用sqlalchemy.orm模块中的object_session函数,如下所示:

from sqlalchemy.orm import object_session

@event.listens_for(Users, 'after_insert')
def create_permissions(mapper, connection, user):
    object_session(user).add(Permissions(user_id=user.user_id))