当创建表条目“B”时,SQLAlchemy自动在表“A”中创建条目

时间:2015-03-24 21:01:51

标签: python mysql database-design sqlalchemy

我认为这个解决方案很简单,但我正在努力解决它。也许我一直盯着它看太久了。

场景:为简单起见,假设我的数据库有一个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()

1 个答案:

答案 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:这是可能的,但有一个额外的时间戳模型,只需使用列。