【发布时间】:2013-05-20 09:11:11
【问题描述】:
我在我的 Flask 项目中添加了一种“迁移”功能。最初我想添加与以下多对多相关的用户和角色:
users_to_roles_association_table = db.Table('users_to_roles',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('role_id', db.Integer, db.ForeignKey('roles.id')))
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, db.Sequence('user_id_seq'), primary_key=True)
..................
roles = relationship('Role', secondary=users_to_roles_association_table, lazy='dynamic')
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, db.Sequence('role_id_seq'), primary_key=True)
rolename = db.Column(db.String(128), unique=False)
..................
这是我的迁移up方法:
def up(self):
try:
user = User.query.filter_by(nickname='alp').first()
if not user:
user = User(email='some@email.com', nickname='admin', status=USER.Active)
password = raw_input("Input password for user %s: " % user.nickname)
user.set_password(password)
db.session.add(user)
role = Role.query.filter_by(rolename='Admin').first()
if not role:
role = Role(rolename='Admin')
db.session.add(role) //HERE
if not user.is_in_role('Admin'):
user.roles.append(role)
except Exception, e:
print "Rolling back changes"
db.session.rollback()
raise
当我运行它时,我遇到了一个异常:sqlalchemy.exc.InvalidRequestError: Object '<Role at 0x331db50>' is already attached to session '3' (this is '2')
如果我注释掉db.session.add(role) 行,错误就消失了,但Role 不会添加到数据库中。
我需要这个逻辑,因为其他一些记录可能在表中,所以我不能保证数据库中不存在特定角色。
如何处理这个错误?
【问题讨论】:
-
在向会话中添加任何内容之前尝试执行您的选择查询(即将
role = Role.query...行移到user = User.query下方)- 有帮助吗? -
@DazWorrall,比你的建议,但我试过了。无论如何 - 我找到了解决方案,它与
db变量有关。
标签: orm sqlalchemy flask