Orm 使用数据库中已存在的对象的SQLAlchemy IntegrityError关系

Orm 使用数据库中已存在的对象的SQLAlchemy IntegrityError关系,orm,sqlalchemy,mapping,python-3.8,referential-integrity,Orm,Sqlalchemy,Mapping,Python 3.8,Referential Integrity,这是我的模型,使用经典映射,类A和B相应地工作 将sqlalchemy作为sa导入 从sqlalchemy.orm导入映射器,关系 从域中导入 从域b导入b 从应用程序扩展导入元数据 a_table=sa.table( “a”,元数据, sa.Column('description',sa.String(30),primary_key=True),#我认为这很重要 sa.Column('value_x',sa.Boolean()), ) b_table=sa.table( “b”,元数据, sa

这是我的模型,使用经典映射,类
A
B
相应地工作

将sqlalchemy作为sa导入
从sqlalchemy.orm导入映射器,关系
从域中导入
从域b导入b
从应用程序扩展导入元数据
a_table=sa.table(
“a”,元数据,
sa.Column('description',sa.String(30),primary_key=True),#我认为这很重要
sa.Column('value_x',sa.Boolean()),
)
b_table=sa.table(
“b”,元数据,
sa.Column('id',sa.BigInteger,主键=True,自动递增=True),
sa.Column('description',sa.String(50),sa.ForeignKey(a_table.c.description),nullable=False),
sa.Column('value_y',sa.String(20),nullable=True),
)
映射器(A,A_表)
映射器(B,B_表,属性={
“rel”:关系(
A、 primaryjoin=(A_table.c.description==b_table.c.description)
),
})
当我使用pytest执行此操作时

obj1:A=retrieve_A_object()#A已经在数据库中了,我知道了
obj2:B=create_B_object()#这是现在创建的,是全新的
obj2.rel=obj1
会话=获取会话()
session.add(obj2)
session.commit()
SQLAlchemy引发了一个错误

    def do_execute(self, cursor, statement, parameters, context=None):
>       cursor.execute(statement, parameters)
E       sqlalchemy.exc.IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "a_pkey"
E       DETAIL:  Key (description)=('MY DESCRIPTION') already exists.
我知道它已经在数据库中,我想保存
B
对象
我怎样才能解决这个问题?为什么会发生这种情况?

可能是因为
obj1
obj2
处于不同的会话中吗?它们是完全不同的obj,我编辑它是为了让它更清晰。不确定确切的用例,但您不应该在
a
的id列上设置外键吗。由于它当前不存在,您需要创建它-是一个选项
A
设置了
description
字段,值
MY description
我在这里发布了一个完整的(非)工作示例