多个模型上的 Alembic 迁移

chi*_*sky 8 python sqlalchemy alembic

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

我目前的设置是:

基础文件

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Run Code Online (Sandbox Code Playgroud)

工作区.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)
Run Code Online (Sandbox Code Playgroud)

主机.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)
Run Code Online (Sandbox Code Playgroud)

alembic/env.py

from host import HostModel
from workspace import WorkspaceModel
target_metadata = [HostModel.metadata, WorkspaceModel.metadata]
Run Code Online (Sandbox Code Playgroud)

错误

ValueError: Duplicate table keys across multiple MetaData objects: "hosts", "workspaces"
Run Code Online (Sandbox Code Playgroud)

mga*_*aia 6

为了从@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
Run Code Online (Sandbox Code Playgroud)

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