Flask SqlAlchemy/Alembic миграция отправляет неверный набор символов в PyMysql
Я потратил на это более 3 часов в течение 18 из 21 дня. Пожалуйста, кто-нибудь, скажите мне, что я неправильно понимаю!
TL; DR: мой код неоднократно отправляет набор символов db в виде строки в PyMysql, в то время как он ожидает объект с атрибутом, называемым "кодировка"
Фон
Это код Python, работающий в Docker-контейнере. Второй контейнер содержит базу данных. Адрес базы данных хранится в .env
переменная называется ENGINE_URL
:
ENGINE_URL=mysql+pymysql://root:@database/starfinder_development?charset=utf8
Я запускаю команды Alembic и Flask-Alembic, используя click
Команды в CLI. Все перечисленные ниже методы используются в командах CLI.
Модели / Настройка базы данных (работает)
from flask import Flask
flask_app = Flask(__name__)
db_engine = SQLAlchemy(flask_app)
from my_application import models
def create_database():
db_engine.create_all()
На этом этапе я могу открыть контейнер базы данных и использовать CLI MySql, чтобы увидеть, что все мои модели теперь преобразованы в таблицы со столбцами и связями.
Попытка 1: Alembic
Создание ревизионных файлов с Alembic (работает)
from alembic.config import Config
def main(): # fires prior to any CLI command
filepath = os.path.join(os.path.dirname(__file__),
"alembic.ini")
alembic_config = Config(file_=filepath)
alembic_config.set_main_option("sqlalchemy.url",
ENGINE_URL)
alembic_config.set_main_option("script_location",
SCRIPT_LOCATION)
migrate_cli(obj={"alembic_config": alembic_config})
def revision(ctx, message):
alembic_config = ctx.obj["alembic_config"]
alembic_command.revision(alembic_config, message)
На данный момент у меня есть файл миграции, который был создан точно так, как ожидалось. Затем мне нужно обновить базу данных с помощью этой миграции...
Запуск миграций с Alembic (не удается)
def upgrade(ctx, migration_revision):
alembic_config = ctx.obj["alembic_config"]
migration_revision = migration_revision.lower()
_dispatch_alembic_cmd(alembic_config, "upgrade",
revision=migration_revision)
уволить это с cli_command upgrade head
вызывает сбой, который я включил здесь внизу, потому что он имеет трассировку стека, идентичную моей второй попытке.
Попытка 2: колба-алембик
Эта попытка находит меня полностью переписывая мой main
а также revision
команды, но это не так далеко, как использование upgrade
,
Создание файлов ревизий с помощью Flask-Alembic (ошибка)
def main(): # fires prior to any CLI command
alembic_config = Alembic()
alembic_config.init_app(flask_app)
migrate_cli(obj={"alembic_config": alembic_config})
def revision(ctx, message):
with flask_app.app_context():
alembic_config = ctx.obj["alembic_config"]
print(alembic_config.revision(message))
Это приводит к ошибке, которая идентична ошибке из моей предыдущей попытки.
Трассировка стека в обоих случаях:
(Идентичный сбой при использовании обновления alembic и ревизии фляги-alembic)
File "/Users/MyUser/.pyenv/versions/3.6.2/envs/sf/lib/python3.6/site-packages/pymysql/connections.py", line 678, in __init__
self.encoding = charset_by_name(self.charset).encoding
AttributeError: 'NoneType' object has no attribute 'encoding'
В ответ я вошел в вышеуказанный файл и добавил печать на L677
, непосредственно перед ошибкой:
печать (self.charset)
utf8
Примечание: если я изменю свой ENGINE_URL
использовать другой ?charset=xxx
, это изменение отражено здесь.
Так что теперь я в тупике
PyMysql ожидает self.charset
иметь атрибут encoding
, но self.charset
это просто строка. Как я могу изменить это, чтобы вести себя как ожидалось?
Помогите?
Правильный ответ был бы альтернативным процессом, хотя самый правильный ответ - помочь мне решить проблему кодировки / кодирования.
Моя основная цель здесь - просто заставить миграцию работать с моим приложением для колб.