env.py 1.7 KB

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