Я использую sqlalchemy и пытаюсь интегрировать alembic для миграции базы данных.
Моя база данных в настоящее время существует и имеет ряд ForeignKeys, определенных без имен. Я хотел бы добавить соглашение об именах, чтобы разрешить миграции, которые влияют на столбцы ForeignKey.
Я добавил соглашение об именах, приведенное здесь, в начало моего файла models.py: Ограничения именования SQLAlchemy
convention = {
"ix": 'ix_%(column_0_label)s',
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}
DeclarativeBase = declarative_base()
DeclarativeBase.metadata = MetaData(naming_convention=convention)
def db_connect():
return create_engine(URL(**settings.DATABASE))
def create_reviews_table(engine):
DeclarativeBase.metadata.create_all(engine)
class Review(DeclarativeBase):
__tablename__ = 'reviews'
id = Column(Integer, primary_key=True)
review_id = Column('review_id', String, primary_key=True)
resto_id = Column('resto_id', Integer, ForeignKey('restaurants.id'),
nullable=True)
url = Column('url', String),
resto_name = Column('resto_name', String)
Я установил alembic/env.py в соответствии с инструкциями по обучению, загружая метаданные моей модели в target_metadata.
Когда я запустил
$: alembic current
Я получаю следующую ошибку: sqlalchemy.exc.InvalidRequestError: Соглашение о присвоении имен, включая% (constraint_name) s, требует, чтобы ограничение было явно указано.
В документах говорится: "Эта же функция [генерация имен для столбцов с использованием соглашения об именах] вступает в силу, даже если мы просто используем флаг Column.unique:" 1, поэтому я думаю, что не должно быть проблемы (они продолжают приводить пример с использованием ForeignKey, который также не назван).
Нужно ли мне возвращаться и давать все мои ограничения явным именам, или есть способ сделать это автоматически?