【问题标题】:Which parts of a SQLAlchemy Table definition are used only for migrations (Alembic) vs. instance manipulation? [closed]SQLAlchemy 表定义的哪些部分仅用于迁移(Alembic)与实例操作? [关闭]
【发布时间】:2020-08-22 06:02:04
【问题描述】:

我正在使用一个数据库,我们已选择使用外部工具来管理架构,并且正在远离 python 进行架构管理。当然,我们的 SQLALchemy ORM 模型仍然存在,我现在想知道它们中包含的大部分信息是否在我们的代码库中有效。我们在模型上定义了 cmets、约束、索引(其中一些不再同步)。进行查询时是否会以任何方式使用此信息?

编辑:

社区已经明确(有充分理由)这个问题需要更有针对性,所以这里有一个表格模型的具体示例和一些具体的“子问题”。

class FileRecord(Base):
    __tablename__ = 'science_file'

    # Table fields
    file_id = Column(Integer, primary_key=True, autoincrement=True)
    filename = Column(String, nullable=False, unique=True,
                      comment='File name, unique by date and version')
    file_date = Column(DateTime,
                       comment='Date parsed from file name')
    file_version = Column(Integer,
                          comment='Version parsed from file name')
    ingest_complete = Column(Boolean, nullable=False, default=False,
                             comment='All packets in the file successfully ingested')
    ingested_at = Column(DateTime, default=datetime.utcnow,
                         comment='Timestamp when file was ingested')

    # Relationships
    science_packets = relationship("SciencePacket",
                                   secondary="sci_pkt_jt", backref=backref("files", lazy='joined'))
    stim_packets = relationship("StimPacket",
                                secondary="stim_pkt_jt", backref=backref("files", lazy='joined'))

    __table_args__ = (UniqueConstraint('file_date', 'file_version'),)

问题

  1. __table_args__ 包含一个唯一约束(也可以包含一个索引,例如)。这是在操作对象实例时使用,还是仅在使用 SQLAlchemy 管理数据库时有用?
  2. ingest_complete 在模型中有 nullable=False 约束。如果数据库强制执行,这是否必要?在尝试持久化实例之前是否对模型进行了“预检查”,或者这种语法仅在使用 SQLAlchemy/Alembic 管理数据库时有用?
  3. 对于模型定义的哪些部分有用/没有用,是否有更通用的规则?例如primary_key 在模型定义中绝对是必需的,但 UniqueConstraint 似乎没有在 Alembic 模式管理之外使用。

【问题讨论】:

  • 嘿模组,我有兴趣把这个问题变成更好的形式。我做了一些编辑。如果您仍然认为它不够专注,请给我一些指导,告诉我我可以做些什么来改进它。

标签: python sqlalchemy alembic


【解决方案1】:

这些数据是不必要的,因为您使用的数据库具有与您的 python 代码分开的架构。数据库模式由一个从你的 python 代码生成它的工具在外部管理。所以你不需要你的 python 代码来拥有数据库模式所拥有的所有信息。

【讨论】:

  • 简洁明了,正好符合我的想法。
  • 在我的问题投票结束后,我“不接受”这个答案。现在这个问题更加集中,它需要一个更具体的答案。 @Ido Nov,请随意添加更多特异性。
猜你喜欢
  • 2014-12-02
  • 2014-05-04
  • 2018-09-09
  • 2016-05-17
  • 2018-03-09
  • 2018-07-08
  • 2013-04-29
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多