Fix Alembic configuration interpolation error

- Fixed configparser.InterpolationSyntaxError by simplifying alembic.ini format strings
- Updated env.py to handle configuration parsing errors gracefully
- Added proper exception handling for logging configuration
- Ensured database directory creation before migrations
- Added fallback engine creation if config parsing fails
- Simplified formatter configuration to avoid interpolation issues

The migration system now handles deployment environments more robustly.
This commit is contained in:
Automated Action 2025-06-24 13:31:11 +00:00
parent b78ac1f072
commit f9a4e68823
2 changed files with 35 additions and 11 deletions

View File

@ -33,8 +33,8 @@ prepend_sys_path = .
# versions/ directory # versions/ directory
# sourceless = false # sourceless = false
# version number format # version number format - using a simpler format to avoid interpolation issues
version_num_format = %04d # version_num_format = %%04d
# version path separator; default is "/" # version path separator; default is "/"
# version_path_separator = : # version_path_separator = :
@ -93,5 +93,4 @@ level = NOTSET
formatter = generic formatter = generic
[formatter_generic] [formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s format = [%(name)s] %(message)s
datefmt = %H:%M:%S

View File

@ -1,6 +1,7 @@
from logging.config import fileConfig from logging.config import fileConfig
from pathlib import Path
from sqlalchemy import engine_from_config from sqlalchemy import engine_from_config, create_engine
from sqlalchemy import pool from sqlalchemy import pool
from alembic import context from alembic import context
@ -15,7 +16,11 @@ config = context.config
# Interpret the config file for Python logging. # Interpret the config file for Python logging.
# This line sets up loggers basically. # This line sets up loggers basically.
if config.config_file_name is not None: if config.config_file_name is not None:
fileConfig(config.config_file_name) try:
fileConfig(config.config_file_name)
except Exception:
# Skip logging configuration if it fails
pass
# add your model's MetaData object here # add your model's MetaData object here
# for 'autogenerate' support # for 'autogenerate' support
@ -58,11 +63,31 @@ def run_migrations_online() -> None:
and associate a connection with the context. and associate a connection with the context.
""" """
connectable = engine_from_config( # Create database directory if it doesn't exist
config.get_section(config.config_ini_section), db_dir = Path("/app/storage/db")
prefix="sqlalchemy.", db_dir.mkdir(parents=True, exist_ok=True)
poolclass=pool.NullPool,
) # Use direct database URL instead of config section to avoid interpolation issues
database_url = config.get_main_option("sqlalchemy.url")
if not database_url:
database_url = "sqlite:////app/storage/db/db.sqlite"
try:
# Try to get configuration section, but handle interpolation errors
configuration = config.get_section(config.config_ini_section, {})
configuration["sqlalchemy.url"] = database_url
connectable = engine_from_config(
configuration,
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
except Exception:
# Fallback: create engine directly if config parsing fails
connectable = create_engine(
database_url,
poolclass=pool.NullPool,
)
with connectable.connect() as connection: with connectable.connect() as connection:
context.configure(connection=connection, target_metadata=target_metadata) context.configure(connection=connection, target_metadata=target_metadata)