我认为这个解决方案很简单,但我正在努力解决它。也许我一直盯着它看太久了。
场景:为简单起见,假设我的数据库有一个Users,Rundata和一个Timestamps表。见下文
class User(Model):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
firstname = Column(String(20))
# ...
registered_on = Column(Integer, ForeignKey('timestamps.id'))
class DataRecord(Model):
__tablename__ = 'data_records'
id = Column(Integer, Sequence('rundata_id_seq'), primary_key=True)
timestamp_id = Column(Integer, ForeignKey('timestamps.id'))
timestamp = relationship('Timestamp') # one (datarecord) to many (many datarecords from different units will share a timestamp)
Tank_P = Column(Float)
# ...
Reactor_P = Column(Float)
class Timestamp(Model):
__tablename__ = 'timestamps'
id = Column(Integer, Sequence('timestamp_id_seq'), primary_key=True)
timestamp = Column(DateTime)
def __init__(self, timestamp=None):
if timestamp:
self.timestamp = timestamp
else:
self.timestamp = datetime.utcnow()
问题1:我可以在模型中构建方法,以便在创建新用户时在时间戳表中创建某些时间戳吗?当用户进入数据库时,registered_on字段获取创建的时间戳的外键。伪代码:
my_user = User(dict_of_data)
db_session.add(my_user)
db_session.commit()
问题2:创建DataRecord条目时,将立即输入许多不同的记录(对应于创建rundata的每个单元)。即,许多DataRecord条目将共享时间戳。此时间戳来自外部源(与用户的registered_on时间戳不同)我是否需要类似下面的伪代码?
ts = timestamp_from_data_software # externally sourced timestamp
my_timestamp = Timestamp(ts)
db_session.add(my_timestamp)
my_timestamp_id = my_timestamp.get_id()
for r in datarecords:
dr = DataRecord(dict_of_data, timestamp_id=my_timestamp_id)
db_session.add(dr)
db_session.commit()
答案 0 :(得分:0)
是的,你当然可以按照你的意思行事。您提供的代码也应该可以正常工作。
虽然,我强烈建议你不要为Timestamp
使用单独的模型,除非你真的有一些奇怪的需要这样做(你为什么要使用不同的模型?)你应该只使用一个其中任一列中的datetime
类型字段名为timestamp
。当然,在这种情况下,每次在表格中创建条目时,您还可以输入您想要的时间戳。
<强>附录强>
在你的第二个代码示例中,虽然我会这样做,
ts = timestamp_from_data_software # externally sourced timestamp
my_timestamp = Timestamp(ts)
db_session.add(my_timestamp)
# my_timestamp_id = my_timestamp.get_id() You don't need to do this
for r in datarecords:
dr = DataRecord(dict_of_data, timestamp_id=my_timestamp) # just use my_timestamp
db_session.add(dr)
db_session.commit()
TL; DR:这是可能的,但不有一个额外的时间戳模型,只需使用列。