Предотвратить алембика от автогенерации таблиц - PullRequest
0 голосов
/ 05 октября 2018

Я новичок в такой серьезности, что могу упустить момент из его концепции, но вот в чем вопрос.

У меня есть несколько таблиц sqlalchemy в приложении с флягами, например:

class Data(Base):
__tablename__ = 'Data'
__table_args__ = {'schema': 'schema'}
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)

Я инициализирую свои таблицы:

Base = declarative_base()
engine = create_engine(db_link, pool_size=100, max_overflow=0)
Base.metadata.create_all(engine)
Session = sessionmaker()
Session.configure(bind=engine)

К этому моменту я создал таблицы в своей базе данных вручную, и все работало хорошо.Чтобы потом работать продуктивно с моим проектом, я хочу иметь возможность перенести мою базу данных с помощью alembic.Поскольку некоторые таблицы, которые я буду использовать (в другой схеме), доступны только для чтения и созданы другой программой, я хочу перенести только некоторые таблицы sqlalchemy.Поэтому мой сценарий обновления выглядит (созданный alembic revision --autogenerate):

revision = 'bb1d39b7eee1'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('Data',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    schema='schema'
    )
    ...

, когда я теперь использую пустую базу данных для переноса своей схемы в:

alembic upgrade head

я получаюследующая ошибка:

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42S01', "[42S01] [M
icrosoft][SQL Server Native Client 11.0][SQL Server]There is already an object n
amed 'Data' in the database. (2714) (SQLExecDirectW)") [SQL: '\nCREATE TABLE schema.
[Data] (\n\tid INTEGER NOT NULL IDENTITY(1,1), \n\tname VARCHAR(max) NOT NULL, \
 \n\tPRIMARY KEY (id), \n\tCHECK (IN (0, 1))\n)\n\n']

Похоже, alembic автоматически создает все таблицы и затем пытается снова создать эти таблицы в моем скрипте ревизии.Если это правда, как я могу сказать Alembic, что он не должен создавать какие-либо таблицы автоматически и запускать только те сценарии, которые я создаю?

1 Ответ

0 голосов
/ 08 октября 2018

Ваша миграция явно создает таблицу Data:

def upgrade():
    ...
    op.create_table('Data',
    ...

Так что, если ваша таблица Data уже существует, потому что вы уже создали ее вручную, это нормально, чтобы получить ошибку.

РЕДАКТИРОВАТЬ: Я не уверен, чтобы понять, когда он выполняется, но вы можете попробовать прокомментировать строку Base.metadata.create_all(engine) в вашем сценарии инициализации базы данных.Я подозреваю, что это для создания таблиц.Я никогда не видел, чтобы alembic создавал таблицы до запуска миграций (это задача миграций для создания таблиц), если это не решит вашу проблему, я думаю, что проблема не в alembic.


Alembic isпредназначена для управления миграцией базы данных с самого начала, она не предполагает, что вы уже создали свои таблицы.

По сути, она создает таблицу для хранения истории миграций, примененной к базе данных.Когда вы запускаете первое обновление, прикладная миграция еще не применяется, поэтому Alembic попытается запустить все обновления миграции от корневого (чей down_revision None) до головного.При каждой примененной миграции он также обновляет свою таблицу истории, чтобы отразить состояние базы данных.

Вы можете (в соответствии с моим уровнем предпочтений):

  1. удалить ваши уже существующие таблицыи пусть алембик создаст их.Таким образом, Alembic просто создает таблицу, как объявлено в миграции, и обновляет ее историю.

  2. заставляет Alembic полагать, что он уже применил первую миграцию, заполнив вручную свою таблицу истории (у меня никогда не былосделал это но думаю это возможно).Таким образом, он не будет пытаться применить его снова

  3. , удалив директивы create_table из функции корневой миграции upgrade() (и, вероятно, drop_table из функции downgrade()),Таким образом, Alembic запустит миграцию, не пытаясь создать уже существующие таблицы, и это должно работать.Он также будет регистрировать миграцию, примененную в его собственной истории.

  4. добавить тест в вашу миграцию, чтобы создать таблицу только в том случае, если она еще не существует, но в этом случае как вы будетеуправлять понижением рейтинга?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...