我正在使用 sqlalchemy 设计一个数据库来存放科学测试数据。我遇到了一个我似乎无法弄清楚的问题。
在我的测试数据中,每个Observation
都有一个 State
(位置、速度、加速度),一个State
有一个关联Time
的(状态应用的时间)。到目前为止,一切都很好。我制作了一个单独的表,Times
因为我处理不同类型的时间,并且我想使用一个参考表来指示每个时间是什么类型的时间(状态时间,观察时间等)。而且我处理的时间类型可能会改变,所以我认为以这种方式标准化会让我在未来添加新的时间类型,因为它们只是参考表中的行。
到目前为止,这部分有效(使用声明式风格):
class Observation(Base):
__tablename__ = 'tbl_observations'
id = Column(Integer, primary_key=True)
state_id = Column(Integer, ForeignKey('tbl_states.id'))
state = relationship('State', uselist=False)
class State(Base):
__tablename__ = 'tbl_states'
id = Column(Integer, primary_key=True)
time_id = Column(Integer, ForeignKey('tbl_times.id'))
time = relationship('Time', uselist=False)
class Time(Base):
__tablename__ = 'tbl_times'
id = Column(Integer, primary_key=True)
time_type_id = Column(Integer, ForeignKey('ref_tbl_time_types.id'))
time_type = relationship('TimeType', uselist=False)
time_value = Column(Float)
class TimeType(Base):
__tablename__ = 'ref_tbl_time_types'
id = Column(Integer, primary_key=True)
desc = Column(String)
皱纹是观察本身可以有不同的时间。Observation
当我尝试在and之间创建一对多关系Time
时,出现循环依赖错误:
class Observation(Base):
__tablename__ = 'tbl_observations'
id = Column(Integer, primary_key=True)
state_id = Column(Integer, ForeignKey('tbl_states.id'))
state = relationship('State', uselist=False)
# Added this line:
times = relationship('Time')
class Time(Base):
__tablename__ = 'tbl_times'
id = Column(Integer, primary_key=True)
time_type_id = Column(Integer, ForeignKey('ref_tbl_time_types.id'))
time_type = relationship('TimeType', uselist=False)
time_value = Column(Float)
# Added this line:
observation_id = Column(Integer, ForeignKey('tbl_observations.id'))
我猜这会中断,因为原始Observation
-> State
->Time
链有一个引用到Observation
.
有没有什么办法解决这一问题?我把我的设计搞砸了吗?我在 sqlalchemy 中做错了吗?我对这一切都很陌生,所以它可能是上述任何一种。您可以提供的任何帮助将不胜感激。
PS我尝试做这里推荐的事情:试图避免循环引用,但要么我做错了,要么它没有解决我的特定问题。