env.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from __future__ import annotations
  2. from logging.config import fileConfig
  3. from alembic import context
  4. from sqlalchemy import engine_from_config, pool
  5. from supply_infra.config import get_infra_settings
  6. from supply_infra.db.base import Base
  7. import supply_infra.db.models # noqa: F401
  8. config = context.config
  9. if config.config_file_name is not None:
  10. fileConfig(config.config_file_name)
  11. # Alembic uses ConfigParser interpolation; escaped credentials may contain "%".
  12. config.set_main_option(
  13. "sqlalchemy.url",
  14. get_infra_settings().mysql_url.replace("%", "%%"),
  15. )
  16. target_metadata = Base.metadata
  17. def run_migrations_offline() -> None:
  18. context.configure(
  19. url=config.get_main_option("sqlalchemy.url"),
  20. target_metadata=target_metadata,
  21. literal_binds=True,
  22. dialect_opts={"paramstyle": "named"},
  23. compare_type=True,
  24. )
  25. with context.begin_transaction():
  26. context.run_migrations()
  27. def run_migrations_online() -> None:
  28. connectable = engine_from_config(
  29. config.get_section(config.config_ini_section, {}),
  30. prefix="sqlalchemy.",
  31. poolclass=pool.NullPool,
  32. )
  33. with connectable.connect() as connection:
  34. if connection.dialect.name == "mysql":
  35. connection.exec_driver_sql("SET time_zone = '+08:00'")
  36. connection.commit()
  37. context.configure(
  38. connection=connection,
  39. target_metadata=target_metadata,
  40. compare_type=True,
  41. )
  42. with context.begin_transaction():
  43. context.run_migrations()
  44. if context.is_offline_mode():
  45. run_migrations_offline()
  46. else:
  47. run_migrations_online()