所以我是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表上没有数据库触发器的情况下这样做。
答案 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))