Я сталкиваюсь с странной проблемой с командой Atembic Autogenerate при настройке первоначальной миграции базы данных для базы данных Postgresql с публичной схемой.
При запуске Alembic Revision -Autogenerate -m public.alembic_version < /code> Таблица, сгенерированный сценарий миграции неправильно включает в себя: < /p>
- ближе к концу обновления () function
Код: Выделить всё
op.drop_table('alembic_version')
- В Downgrade () function
Код: Выделить всё
op.create_table('alembic_version', ...)
Код: Выделить всё
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "public.alembic_version" does not exist
[SQL: INSERT INTO public.alembic_version (version_num) VALUES ('xxxxxxxx') ...]
. Настройка (соответствующие порции): < /p>
Код: Выделить всё
# --- Target Metadata and Schema ---
target_metadata = frontend_metadata # Use the imported metadata
target_schema = getattr(settings.FRONTEND_DB, 'SCHEMA', None) or 'public'
def run_migrations_offline() -> None:
"""Run migrations in 'offline' mode."""
url = get_url()
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
include_schemas=True,
version_table_schema=target_schema,
)
with context.begin_transaction():
context.run_migrations()
def run_migrations_online() -> None:
"""Run migrations in 'online' mode."""
configuration = config.get_section(config.config_ini_section, {})
configuration["sqlalchemy.url"] = get_url()
connectable = engine_from_config(
configuration,
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
include_schemas=True,
version_table_schema=target_schema,
compare_type=True,
compare_server_default=True
)
with context.begin_transaction():
context.run_migrations()
< /code>
Я использую sqlalchemy с PostgreSQL. Модели базы данных определяются с более сложной настройкой:
в database.py
Код: Выделить всё
class DatabaseConnection:
def __init__(self):
# Create metadata with proper schema
self.frontend_metadata = MetaData(schema=settings.FRONTEND_DB.SCHEMA)
# Create bases - these are the definitive base classes for models
self.FrontendBase = declarative_base(metadata=self.frontend_metadata)
# ... other initialization code ...
# Create global database instance
db = DatabaseConnection()
# Export commonly used items
FrontendBase = db.FrontendBase
frontend_metadata = db.frontend_metadata
__all__ = [
"db",
"FrontendBase",
"frontend_metadata",
# ... other exports ...
]
Код: Выделить всё
from src.services.vamos.database.database import FrontendBase
class BaseModel(FrontendBase):
"""Base model for all SQLAlchemy models."""
__abstract__ = True
# Model fields...
< /code>
Что я проверил < /h2>
[*]alembic_version
[*] Я подтвержден target_metadata не содержит какого -либо определения для Alembic_version
[*] оба Target_schema и версии Если я вручную удаляю линию op.drop_table ('alembic_version') < /code> из сгенерированного сценария, миграция работает отлично < /li>
< /ol>
Вопросы < /h2>
- это известный вопрос с алембиком? Должен ли он игнорировать таблицу alembic_version по умолчанию?
Есть ли что -то не так с моей конфигурацией, которая вызывает такое поведение? /> Версия Alembic: 1.15.1 < /li>
SQLalchemy Версия: 2.0.39 < /li>
Python: 3.10.11 < /li>
База данных: postgresql 17.2 (aws rds) < /li>
os: windesql 17.2 (aws rds) < /li>
/> Любая помощь будет оценена - я бы хотел понять, делаю ли я что -то не так или это действительно ошибка с Алембиком. < /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... sion-table