Перегонные миграции на нескольких моделях

Я пытаюсь создать ревизию с --autogenerate, используя Alembic для двух моделей, но получаю сообщение об ошибке повторяющихся ключей таблицы. Нужно ли указывать схему? Если да, то как его можно установить? В документации, которую я прочитал, говорится об использовании __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"

person chirinosky    schedule 01.01.2018    source источник
comment
target_metadata должно быть просто target_metadata = Base.metadata.   -  person univerio    schedule 02.01.2018
comment
Спасибо @univerio. Когда я попытался это сделать, данные модели не были прочитаны, и я получил пустую миграцию; upgrade() и downgrade() ничего не содержали.   -  person chirinosky    schedule 02.01.2018
comment
Вы уверены, что это не просто означает, что ваша схема не имеет изменений?   -  person univerio    schedule 02.01.2018
comment
Я уверен. Содержимое каталога alembic/versions было удалено, а база данных удалена и создана заново. Переход на target_metadata = Base.metadata сгенерировал пустые миграции.   -  person chirinosky    schedule 02.01.2018
comment
Тогда вы уверены, что все импортировали правильно? Использование Base.metadata не означает, что вы можете удалить импорт from host import HostModel и from workspace import WorkspaceModel.   -  person univerio    schedule 02.01.2018
comment
Ого, не импортировал модели. Это решило проблему. Я был бы рад принять, если вы опубликуете в качестве ответа. Конечно, ценю помощь.   -  person chirinosky    schedule 03.01.2018
comment
К сожалению, импорт моделей в alembic 1.5.4 не помог: upgrade(), downgrade() остались незаполненными   -  person Ladenkov Vladislav    schedule 17.02.2021


Ответы (2)


Чтобы было понятно, откуда @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 сама по себе не знает ни о какой модели.

person mgarciaisaia    schedule 15.07.2020
comment
К сожалению, импорт моделей в alembic 1.5.4 не помог: upgrade(), downgrade() остались незаполненными - person Ladenkov Vladislav; 17.02.2021

цитируя ответ универио, это спасает мой день.

target_metadata должно быть просто target_metadata = Base.metadata Использование Base.metadata не означает, что вы можете удалить импорт из hostModel import HostModel и из workspace import WorkspaceModel

Это сработало для меня.

person esdotzed    schedule 25.02.2020