IiはSQLAlchemyの中に次のクラス定義された:SQLAlchemyのマッパーイベント発行
class User(Base):
__tablename__ = 'user'
userId = Column(Integer, primary_key=True)
email = Column(String(60), unique=True,nullable=False)
userName = Column(Unicode(16),unique=True)
_password = Column('password', Unicode(60))
groups = relationship("Group",secondary='userGroup')
profile = relationship("UserProfile",uselist=False,backref='user')
class Group(Base):
__tablename__ = 'group'
groupId = Column(Integer,
Sequence('group_id_seq', optional=True),
primary_key=True)
groupName = Column(Unicode(255), unique=True)
UserGroupTable = Table('userGroup', Base.metadata,
Column('userId', Integer, ForeignKey(User.userId)),
Column('groupId', Integer, ForeignKey(Group.groupId))
)
class UserProfile(Base):
__tablename__='userProfile'
userId = Column(Integer, ForeignKey('user.userId'), primary_key=True)
dateJoin = Column(Date,nullable=False,default=func.current_date())
gender = Column(Integer)
をuser
はgroup
と多対多の関係にあり、私はテーブルを初期化するとき、私は2つのグループのユーザー」を追加し、以下のように 'admin'。私は、新しいユーザーを追加しようとすると、ユーザーが追加された
def before_insert_user_listener(mapper,connection,target):
session=DBSession()
ug=session.query(Group).filter(Group.groupName=='user').first()
target.groups.append(ug)
target.profile=UserProfile()
log.debug(">>>>>")
def initialize_sql(engine):
DBSession.configure(bind=engine)
Base.metadata.bind = engine
Base.metadata.create_all(engine)
try:
session = DBSession()
#event register
event.listen(User,'before_insert',before_insert_user_listener)
group1 = Group('admin')
group2 = Group('user')
session.add(group1)
session.add(group2)
transaction.commit()
except IntegrityError:
pass
、およびI:問題は、私は、インサート、それが動作しない場合「ユーザー」グループにユーザーを追加するマッパーイベントを使用する場合ということですイベントリスナーからのログプリントを見ることができますが、ユーザーは 'user'グループに追加されません。私はまた、 'after_insert'イベントを試みましたが、それはまた動作しませんでした。
編集:ユーザーと1対1の関係であるuserProfileテーブルを追加し、上記のbefore_insertイベントで既定の参加日を使用してユーザープロファイルを作成できます。グループにユーザーを追加してもまだ動作しません。
私は何を欠席しましたか?
ありがとうございます! before_insertドキュメントから抽出物として
実際には、データベースに 'transaction.commit()'のグループを格納しましたか?私はそれらが 'session'に追加されているのを見ません。 – van
ああ。実際には追加されています。私は無関係なコードを削除していて、誤ってそれらの行を削除しました。ちょうど加えられた。指摘してくれてありがとう。 – 3van
私はそうだと思いますが、テストコードとイベントリスナーの 'DBSession()'が実際に同じセッションであることを確認してください。そうでない場合は、理由を見つけたので、 'object_session'を使ってリスナーに適切なものを取得することができます。 – van