0

だから私はSQLAlchemyに不慣れで、新しいUserオブジェクトが作成された後、Permissionsオブジェクトがデフォルトで作成されることを望んでいます。ドキュメントを読むと、after_insertマッパーイベントが私が使用すべきもののようです。問題は、オブジェクトが実際にコミットされる前にイベントリスナーが呼び出されることです。

少なくとも、パーミッションオブジェクトをトランザクションに入れるか、ユーザーオブジェクトが実際にコミットされた後に作成されるオブジェクトのリストに入れる方法はありますか?

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テーブルにデータベーストリガーを指定せずにこれを実行したいと思います。

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 に答える