首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlalchemy mapper事件问题

sqlalchemy mapper事件问题
EN

Stack Overflow用户
提问于 2011-12-06 14:29:16
回答 1查看 1.2K关注 0票数 0

Ii在sqlalchemy中定义了以下类:

代码语言:javascript
复制
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)

usergroup有着多对多的关系,当我初始化表时,我添加了两个组'user‘和'admin’,如下所示。问题是,当我在插入时使用mapper事件将用户添加到“user”组时,它不起作用:

代码语言:javascript
复制
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

当我尝试添加一个新用户时,会添加该用户,并且我可以从事件侦听器中看到日志打印,但是用户没有被添加到' user‘组中。我也尝试了'after_insert‘事件,但它也没有工作。

编辑:我添加了userProfile表,它与用户是一对一的关系,并且可以在上面的before_insert事件中创建一个带有默认连接日期的用户配置文件。添加用户到组,但仍然没有工作。

我错过了什么?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2011-12-06 22:39:13

正如插入文档的摘录所示:

可以在此方法中修改基于列的属性,这将导致插入新值。但是,不会更改整个刷新计划的,并且对会话的操作不会产生预期的效果。若要在扩展中操作会话,请使用SessionExtension。

由此我得出结论,不能向会话中添加新的对象,这些对象正在被注释/刷新或添加/设置关系。

我想更好的方法是侦听提交同花顺会话事件,检查所有新的User对象并将它们添加到User组中。例如:

代码语言:javascript
复制
def my_before_commit(session):
    g=session.query(Group).filter(Group.groupName=='user').one()
    for target in session:
        if isinstance(target, User) and target in session.new:
            target.groups.append(ug)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8401524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档