因此,我是SQLAlchemy的新手,我希望在创建新的User对象之后,默认情况下会创建Permissions对象。阅读文档,似乎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):
    connection.execute(Permissions.__table__.insert(user_id=user.user_id))


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

理想情况下,我希望在Users表上没有数据库触发器的情况下执行此操作。

最佳答案

您不需要将会话附加到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))

关于python - Python SQLAlchemy after_insert MapperEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14529046/

10-16 02:13