我正在尝试使用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"
答案 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中删除导入
对我有用。