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

Python 创建表条目“B”时,SQLAlchemy会自动在表“A”中创建条目,python,mysql,database-design,sqlalchemy,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)) # ...

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

场景:为了简单起见,假设我的数据库有一个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:创建数据记录条目时,将同时输入与创建运行数据的每个单元对应的许多不同记录。也就是说,许多数据记录条目将共享一个时间戳。这个时间戳来自外部源,与用户在时间戳上注册的_不同,我需要下面的伪代码吗

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()

是的,你当然可以按照你的建议去做。您提供的代码也应该可以正常工作

尽管如此,我还是强烈建议您不要对时间戳使用单独的模型,除非您确实有一些奇怪的需要,为什么要使用不同的模型?您应该在这些列中的任何一列中使用名为timestamp的datetime类型字段。当然,在这种情况下,每次在表中创建一个条目时,您也可以输入您想要的时间戳

附件:

在您的第二个代码示例中,虽然我会这样做

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

为什么建议不要额外的时间戳模型?系统每几分钟向rundata表写入多达100条记录,所有记录都具有相同的时间戳。我的想法是,它将大大降低尺寸100是一个非常小的数字。你需要考虑每次你做一个连接,这比拥有一个列要重。同样在python级别,如果它是一个新模型,则需要更多的空间来保留python对象。此外,创建对象需要花费更多的时间。尽可能多地在数据库级别进行操作,这样会更快、更优化,除非你做得太疯狂。同时,最好保持数据库模式尽可能简单,以提高代码可读性和维护性。