env.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """Alembic运行环境。"""
  2. from __future__ import annotations
  3. import os
  4. from logging.config import fileConfig
  5. from alembic import context
  6. from sqlalchemy import engine_from_config, pool
  7. from dms.config import load_dms_config
  8. from dms.extensions import db
  9. import dms.models # noqa: F401
  10. config = context.config
  11. if config.config_file_name is not None:
  12. fileConfig(config.config_file_name)
  13. # 连接串优先级:环境变量 > alembic.ini > load_dms_config默认值。
  14. # 环境变量最高优先,保证测试(conftest注入测试库)不会被ini中的真实地址劫持。
  15. url = (
  16. os.environ.get("DMS_DATABASE_URL", "").strip()
  17. or (config.get_main_option("sqlalchemy.url") or "").strip()
  18. or load_dms_config()["SQLALCHEMY_DATABASE_URI"]
  19. )
  20. config.set_main_option("sqlalchemy.url", url.replace("%", "%%"))
  21. target_metadata = db.metadata
  22. def run_migrations_offline() -> None:
  23. context.configure(
  24. url=config.get_main_option("sqlalchemy.url"),
  25. target_metadata=target_metadata,
  26. literal_binds=True,
  27. dialect_opts={"paramstyle": "named"},
  28. compare_type=True,
  29. compare_server_default=True,
  30. )
  31. with context.begin_transaction():
  32. context.run_migrations()
  33. def run_migrations_online() -> None:
  34. connectable = engine_from_config(
  35. config.get_section(config.config_ini_section, {}),
  36. prefix="sqlalchemy.",
  37. poolclass=pool.NullPool,
  38. isolation_level="READ COMMITTED",
  39. connect_args={"init_command": "SET time_zone = '+00:00'"},
  40. )
  41. with connectable.connect() as connection:
  42. context.configure(
  43. connection=connection,
  44. target_metadata=target_metadata,
  45. compare_type=True,
  46. compare_server_default=True,
  47. )
  48. with context.begin_transaction():
  49. context.run_migrations()
  50. if context.is_offline_mode():
  51. run_migrations_offline()
  52. else:
  53. run_migrations_online()