alembic reads alembic.ini with encoding="locale". On Python 3.11 that is the Windows ANSI code page even under PYTHONUTF8=1, which the desktop shell sets, so the em dashes in the ini's comments raised UnicodeDecodeError inside Config() on cp932/cp936/cp949/cp950 systems. _run_alembic_upgrade treats that as "alembic unavailable": every startup logged "alembic upgrade head skipped: 'cp949' codec can't decode byte 0xe2", never took the pre-migration backup, and never ran a migration -- including the data-healing ones (0006/0007) that the additive column reconcile cannot replace. The ini is now ASCII, with a note saying why, and a test parses it in each of those code pages with the parser alembic builds and pins it ASCII. Same Python 3.11 locale-decoding class as the .pth fix in #1795. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
62 lines
1.7 KiB
INI
62 lines
1.7 KiB
INI
# Alembic configuration for VoiceStudio.
|
|
# Run from anywhere: alembic -c <repo>/alembic.ini <command>
|
|
# Default commands:
|
|
# alembic upgrade head - apply all pending migrations
|
|
# alembic revision -m "..." - create a new migration
|
|
# alembic current - show current schema version
|
|
#
|
|
# Keep this file ASCII: alembic reads it in the locale code page, which on a
|
|
# Chinese, Japanese or Korean Windows cannot decode UTF-8 punctuation
|
|
# (tests/test_alembic_ini_locale.py).
|
|
#
|
|
# DB URL is resolved dynamically from core.config (env aware).
|
|
# See backend/migrations/env.py.
|
|
|
|
[alembic]
|
|
# %(here)s = this file's directory. Alembic resolves bare relative paths
|
|
# against the process CWD, not the ini - and the app doesn't always start
|
|
# from the repo root (`tauri dev` runs the backend with
|
|
# cwd=frontend/src-tauri), which made startup migrations die with
|
|
# "Path doesn't exist: backend/migrations" the first time one was pending.
|
|
script_location = %(here)s/backend/migrations
|
|
prepend_sys_path = %(here)s/backend
|
|
# Split multi-path options on os.pathsep, not the legacy space/comma/colon
|
|
# set - a colon-split would shred "C:\..." absolute paths on Windows.
|
|
path_separator = os
|
|
# sqlalchemy.url is set programmatically in env.py - do NOT set it here.
|
|
sqlalchemy.url =
|
|
|
|
[loggers]
|
|
keys = root, sqlalchemy, alembic
|
|
|
|
[handlers]
|
|
keys = console
|
|
|
|
[formatters]
|
|
keys = generic
|
|
|
|
[logger_root]
|
|
level = WARN
|
|
handlers = console
|
|
qualname =
|
|
|
|
[logger_sqlalchemy]
|
|
level = WARN
|
|
handlers =
|
|
qualname = sqlalchemy.engine
|
|
|
|
[logger_alembic]
|
|
level = INFO
|
|
handlers =
|
|
qualname = alembic
|
|
|
|
[handler_console]
|
|
class = StreamHandler
|
|
args = (sys.stderr,)
|
|
level = NOTSET
|
|
formatter = generic
|
|
|
|
[formatter_generic]
|
|
format = %(levelname)-5.5s [%(name)s] %(message)s
|
|
datefmt = %H:%M:%S
|