0

所以我是 SQLAlchemy 的新手,我想在创建新的用户对象后默认创建一个权限对象。阅读文档似乎 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, '无法添加或更新子行:外键约束失败

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

4

2 回答 2

3

您不需要将会话附加到 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))
于 2013-03-30T16:35:57.403 回答
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))
于 2013-01-25T20:52:14.160 回答