我的问题是,当我在会话中有一个新创建的对象(还没有主键,但会在刷新时获取它)并且我将另一个对象合并到该会话中,该对象通过关系引用第一个对象(示例中的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'}