Flask 动态创建条目时Sqlalchemy复制条目

Flask 动态创建条目时Sqlalchemy复制条目,flask,sqlalchemy,Flask,Sqlalchemy,在我的应用程序中,我将SQLAlchemy(通过MySQL)与Flask一起使用,在我目前的情况下,我需要动态创建条目。例如,在从表A创建实例时,我的脚本将看到我们需要创建一个相关条目B,因此在创建B之后,它将尝试将B分配给A实例的一个关系属性 以下是一些示例模型: 我遇到的问题是,在运行类似以下内容后,出现了SQL重复条目异常: 它将抛出一个异常,如: sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (10

在我的应用程序中,我将SQLAlchemy(通过MySQL)与Flask一起使用,在我目前的情况下,我需要动态创建条目。例如,在从表A创建实例时,我的脚本将看到我们需要创建一个相关条目B,因此在创建B之后,它将尝试将B分配给A实例的一个关系属性

以下是一些示例模型:

我遇到的问题是,在运行类似以下内容后,出现了SQL重复条目异常:

它将抛出一个异常,如:

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)]
将条目添加到会话和/或刷新条目的方式是否有问题?甚至可以像这样实例化条目吗


非常感谢您的反馈。

在更新了我的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()

在更新了我的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()
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()