SQLAlchemy 的合并不会用关系中新对象的 id 填充外键

Ojo*_*mio 6 python sqlalchemy

我的问题是,当我在会话中有一个新创建的对象(还没有主键,但会在刷新时获取它)并且我将另一个对象合并到该会话中,该对象通过关系引用第一个对象(示例中的b ) SQLAlchemy 不会使用前一个对象的主键填充后一个对象。相反,它只是从序列中生成下一个值。为什么会这样呢?

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker



engine = create_engine("postgresql+psycopg2://psql_admin:psql_admin@localhost/fm")



from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

from sqlalchemy import Integer, ForeignKey, VARCHAR, TEXT, Boolean, DateTime
from sqlalchemy.orm import relationship
from sqlalchemy.sql.schema import Column

class B(Base):
    __tablename__='B'
    id_=Column(Integer, primary_key=True)
    data = Column(VARCHAR(30))

class Rel(Base):
    __tablename__='Rel'
    id_a=Column(Integer, primary_key=True)
    id_b=Column(Integer, ForeignKey('B.id_'), primary_key=True)
    b = relationship(B)
    rel_data=Column(VARCHAR(30))


Session = sessionmaker(bind=engine)   
session = Session()
Base.metadata.create_all(engine, checkfirst=True)


first_b=B(id_=1, data='ololo')    
session.add(first_b)
session.commit()

session.add(Rel(id_a=800,id_b=1, rel_data='first relation data'))

second_b=B(data='foooo')
session.add(second_b)
x=session.merge(Rel(id_a=800, rel_data="second", b=second_b))
session.commit()
Run Code Online (Sandbox Code Playgroud)

这里我有一个错误

IntegrityError:(由于查询调用的自动刷新而引发;如果此刷新过早发生,请考虑使用 session.no_autoflush 块)(IntegrityError)重复键值违反唯一约束“B_pkey”详细信息:键(id_)=(1)已经存在。'插入“B”(数据)值(%(数据)s)返回“B”.id_'{'data':'foooo'}