【发布时间】:2017-09-19 21:11:37
【问题描述】:
在我的应用程序中,我在 Flask 中使用 SQLAlchemy(通过 MySQL),在我目前的情况下,我需要动态创建条目。例如,在从表 A 创建实例时,我的脚本会看到我们需要创建一个相关条目 B,因此在创建 B 之后,它会尝试将 B 分配给 A 的实例的关系属性之一。
以下是一些示例模型:
a_b = db.Table('a_b',
db.Column('a_id', db.Integer,
db.ForeignKey('a.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('b_id', db.Integer,
db.ForeignKey('b.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True))
class ModelA(db.Model):
__tablename__ = 'a'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
model_bs = db.relationship('ModelB', secondary=a_b,
back_populates='model_as')
class ModelB(db.Model):
__tablename__ = 'b'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
model_as = db.relationship('ModelA', secondary=a_b,
back_populates='model_bs')
我遇到的问题是 SQL 重复条目异常,运行如下所示:
from base import db
from base.database.models.models import ModelA, ModelB
def creation_test():
with db.session.no_autoflush:
# Start creating A
a = ModelA()
a.name = 'A Example'
# See that we need B, so create B
b = ModelB()
b.name = 'B Example'
b.model_as = []
db.session.add(b)
db.session.flush((b,))
# Use B in the relationship from A
a.model_bs = [b]
db.session.add(a)
db.session.flush((a,))
db.session.commit()
creation_test()
它会吐出如下异常:
sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1062, "Duplicate entry '1-1' for key 'PRIMARY'") [SQL: u'INSERT INTO a_b (a_id, b_id) VALUES (%s, %s)'] [parameters: (1L, 1L)]
如何将条目添加到会话和/或如何刷新它们是否有问题?甚至可以实例化这样的条目吗?
感谢任何反馈。
【问题讨论】:
标签: flask sqlalchemy