【问题标题】:Alembic Migrations on Multiple Models多个模型上的 Alembic 迁移
【发布时间】:2018-06-11 17:52:58
【问题描述】:

我正在尝试使用 Alembic 为两个模型创建带有 --autogenerate 的修订,但我收到了重复的表键错误。是否需要指定架构?如果可以,如何设置?我读过的文档说要使用__table_args__ = {'schema': 'somename'},但这并没有帮助。非常感谢任何提示或建议。

我目前的设置是:

base.py

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

workspace.py

from sqlalchemy import Column, Integer, String
from base import Base

class WorkspaceModel(Base):

    __tablename__ = 'workspaces'

    id = Column(Integer, primary_key=True)
    name = Column(String)

host.py

from sqlalchemy import Column, Integer, String
from base import Base

class HostModel(Base):

    __tablename__ = 'hosts'

    id = Column(Integer, primary_key=true)
    ip = Column(String)

alembic/env.py

from host import HostModel
from workspace import WorkspaceModel
target_metadata = [HostModel.metadata, WorkspaceModel.metadata]

错误

ValueError: Duplicate table keys across multiple MetaData objects: "hosts", "workspaces"

【问题讨论】:

  • target_metadata 应该只是 target_metadata = Base.metadata
  • 谢谢@univerio。当我尝试这样做时,没有读取模型数据并给了我一个空白迁移; upgrade() 和 downgrade() 不包含任何内容。
  • 我确定。 alembic/versions 目录内容被删除,数据库被删除并重新创建。切换到target_metadata = Base.metadata 会生成空白迁移。
  • 那你确定你已经正确地导入了所有东西吗?使用Base.metadata 并不意味着您可以删除导入from host import HostModelfrom workspace import WorkspaceModel
  • 哇哦,不是在导入模型。这解决了这个问题。如果您作为答案发布,我很乐意接受。当然感谢您的帮助。

标签: python sqlalchemy alembic


【解决方案1】:

为了从 @esdotzed@univerio 所说的内容中弄清楚,您必须使用单个 Base.metadata - 但仍然是 import 各个模型

在最初的问题中,alembic/env.py 应该是这样的:

from base import Base

# This two won't be referenced, but *have* to be imported to populate `Base.metadata`
from host import HostModel
from workspace import WorkspaceModel

target_metadata = Base.metadata

如果您没有 import 两个模型,那么自动生成的迁移最终会删除您的整个数据库 - 因为 Base.metadata 本身不知道任何模型。

【讨论】:

  • 不幸的是,在 alembic 1.5.4 中导入模型并没有帮助:upgrade()、downgrade() 未填充
  • 我希望这个答案被接受,因为它是正确的
【解决方案2】:

从评论部分引用 univerio 的回答:

target_metadata 应该只是 target_metadata = Base.metadata

使用 Base.metadata 并不意味着您可以从主机导入 HostModel 和从工作区导入 WorkspaceModel 中删除导入

它对我有用。

【讨论】:

  • @snakecharmerb 此用户刚刚将评论部分中提供的答案移动到实际答案中。我认为这是一件有效的事情。
  • @Ente 啊,“答案”骗了我。很好的编辑。我无法收回 NAA 标志,但我承认这个答案应该保持开放。
猜你喜欢
  • 2013-07-06
  • 2014-05-18
  • 2021-12-17
  • 2013-07-04
  • 2018-09-09
  • 2013-03-18
  • 2017-05-12
  • 2018-06-22
相关资源
最近更新 更多