【问题标题】:Sqlalchemy duplicate entry when creating entries dynamically动态创建条目时的Sqlalchemy重复条目
【发布时间】: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


    【解决方案1】:

    在更新了我的 SQLAlchemy 版本并测试了一些东西之后,我似乎能够通过在创建每个实例之间删除刷新来解决这个问题,而只是在提交会话之前执行一次刷新:

    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)
    
            # Use B in the relationship from A
            a.model_bs = [b]
            db.session.add(a)
    
        db.session.flush()
        db.session.commit()
    
    creation_test()
    

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2017-08-27
      • 1970-01-01
      • 2018-08-15
      • 2016-03-30
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      相关资源
      最近更新 更多