env.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from __future__ import annotations
  2. import os
  3. from logging.config import fileConfig
  4. from alembic import context
  5. from sqlalchemy import engine_from_config, pool
  6. config = context.config
  7. if config.config_file_name is not None:
  8. fileConfig(config.config_file_name)
  9. database_url = os.environ.get("SQLALCHEMY_DATABASE_URI") or os.environ.get(
  10. "DATABASE_URL"
  11. )
  12. if not database_url:
  13. raise RuntimeError(
  14. "SQLALCHEMY_DATABASE_URI or DATABASE_URL must be configured for migrations"
  15. )
  16. # ConfigParser treats percent signs as interpolation markers.
  17. config.set_main_option("sqlalchemy.url", database_url.replace("%", "%%"))
  18. target_metadata = None
  19. def run_migrations_offline() -> None:
  20. context.configure(
  21. url=database_url,
  22. target_metadata=target_metadata,
  23. literal_binds=True,
  24. dialect_opts={"paramstyle": "named"},
  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. context.configure(connection=connection, target_metadata=target_metadata)
  36. with context.begin_transaction():
  37. context.run_migrations()
  38. if context.is_offline_mode():
  39. run_migrations_offline()
  40. else:
  41. run_migrations_online()