![](/img/trans.png)
[英]in sqlalchemy, how can I import existing table having foreign key on the other table
[英]SQLAlchemy: How to handle adjacency list with foreign key to other table?
让我们考虑以下最小示例:
我想出的代码的最小工作示例如下:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import sessionmaker, scoped_session, relationship
engine = create_engine('postgresql://postgres:12345@localhost:5432/Example')
Session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()
class Measurement(Base):
__tablename__ = 'measurement'
id = Column(Integer, primary_key=True)
name = Column(String)
simulation = relationship('Simulation', back_populates='measurement', uselist=False)
class Simulation(Base):
__tablename__ = 'simulation'
id = Column(Integer, primary_key=True)
name = Column(String)
measurement_id = Column(Integer, ForeignKey('measurement.id', onupdate='CASCADE', ondelete='CASCADE'))
parent_simulation_id = Column(Integer, ForeignKey('simulation.id'), index=True)
measurement = relationship('Measurement', back_populates='simulation')
parent_simulation = relationship('Simulation', remote_side=id, backref='child_simulation')
Base.metadata.create_all(engine)
但是现在我使用代码有一个奇怪的行为。 有了第一个测试代码,一切都很顺利:
sess = Session()
measurement = Measurement(name='Measurement_1')
sess.add(measurement)
sess.commit()
simulation1 = Simulation(name='Simulation_1', measurement=measurement, parent_simulation=None)
simulation2 = Simulation(name='Simulation_1.1', measurement=measurement, parent_simulation=simulation1)
sess.add_all((simulation2, simulation1))
sess.commit()
正如所料,output 如下:
id | name | measurement_id | parent_simulation_id
----+----------------+----------------+----------------------
1 | Simulation_1 | 1 |
2 | Simulation_1.1 | 1 | 1
但是,如果我更改测试代码,以便在第二个模拟被初始化之前刷新第一个模拟......
sess = Session()
measurement = Measurement(name='Measurement_1')
sess.add(measurement)
sess.commit()
simulation1 = Simulation(name='Simulation_1', measurement=measurement, parent_simulation=None)
sess.add_all((simulation1, ))
sess.flush()
simulation2 = Simulation(name='Simulation_1.1', measurement=measurement, parent_simulation=simulation1)
sess.add_all((simulation2, ))
sess.commit()
...结果不再像预期的那样:
id | name | measurement_id | parent_simulation_id
----+----------------+----------------+----------------------
1 | Simulation_1 | |
2 | Simulation_1.1 | 1 | 1
我究竟做错了什么? 为什么我进入第二个模拟后第一个模拟的measurement_id
消失了?
我不确定我是否完全理解您的数据 model,但是对于没有引用或引用一个测量的模拟,您不需要
measurement = relationship('Measurement', back_populates='simulation')
在模拟class,你呢? 尝试消除这种关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.