多个模型的Alembic迁移

时间:2018-01-01 22:59:09

标签: python sqlalchemy alembic

我正在尝试使用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)

蒸馏器/ 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"

2 个答案:

答案 0 :(得分:3)

要明确说明@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本身并不了解任何模型。

答案 1 :(得分:1)

引用univerio的答案,这可以节省我的时间。

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

对我有用。