Я использую sqlalchemy и пытаюсь интегрировать перегонный куб для миграции базы данных.
Моя база данных в настоящее время существует и имеет несколько 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, который тоже не назван).
Нужно ли мне вернуться и дать всем моим ограничениям явные имена, или есть способ сделать это автоматически?