Многопользовательская версия Alembic AWSPython

Программы на Python
Ответить
Anonymous
 Многопользовательская версия Alembic AWS

Сообщение Anonymous »

Я создаю мультитенантную SaaS-систему с несколькими базами данных, по одной на каждого арендатора в среде AWS. Я столкнулся с проблемой управления версиями миграции, чтобы все арендаторы имели одну и ту же схему.
Идея заключалась в том, чтобы сгенерировать миграцию на моем локальном компьютере, сравнив ее с последней сгенерированной версией, а затем развернуть ее так, чтобы все базы данных арендаторов обновлялись правильно. Однако я не могу поддерживать общую схему для сравнения.
Можно ли сделать это без создания общедоступного экземпляра контроля?
Раздел моего кода, отвечающий за выполнение миграции, показан ниже. Первоначальная миграция прошла отлично, но теперь я сталкиваюсь с ошибкой при попытке создать новую миграцию, поскольку получаю сообщение:

ОШИБКА [alembic.util.messaging] Целевая база данных не обновлена. ОШИБКА: целевая база данных устарела.


def run_migrations_online():
import sys

is_generating = any(cmd in sys.argv for cmd in ["revision"])

if is_generating:
from sqlalchemy import create_engine

connectable = create_engine("sqlite:///:memory:")

with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
compare_type=True,
compare_server_default=True,
render_as_batch=False,
)

with context.begin_transaction():
context.run_migrations()

return

tenants = tenant_config_manager.list_all_tenants()

if not tenants:
return

success_count = 0
error_count = 0

for tenant_id in tenants:
try:
db_url = tenant_config_manager.get_database_url(tenant_id)

if not db_url:
error_count += 1
continue

from sqlalchemy import create_engine

connectable = create_engine(
db_url,
poolclass=pool.NullPool,
)

with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
version_table=f"alembic_version",
compare_type=True,
compare_server_default=True,
)

with context.begin_transaction():
context.run_migrations()

success_count += 1

except Exception as e:
error_count += 1

if error_count > 0:
logger.warning(f"⚠️ Alguns tenants falharam.")


Подробнее здесь: https://stackoverflow.com/questions/798 ... tenant-aws
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»