Flask SqlAlchemy / Alembic迁移将无效的字符集发送到PyMysql

时间:2018-04-25 01:49:51

标签: python flask sqlalchemy flask-sqlalchemy alembic

在过去21天中的18天里,我花了3个多小时。请有人告诉我,我误解了什么!

TL; DR:我的代码重复将db charset作为字符串发送到PyMysql,同时它期望一个名为"编码&#的属性的对象34;

背景

这是在docker容器上运行的Python代码。第二个容器容纳数据库。数据库地址存储在名为.env的{​​{1}}变量中:

ENGINE_URL

我在CLI中使用ENGINE_URL=mysql+pymysql://root:@database/starfinder_development?charset=utf8 命令触发了Alembic和Flask-Alembic命令。以下所有方法都在CLI命令中使用。

模型/数据库设置(工作)

click

此时我可以打开数据库容器并使用MySql CLI查看我的所有模型现在已经转换为包含列和关系的表。

尝试1:Alembic

使用Alembic创建修订文件(有效)

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()

此时我有一个完全按照预期创建的迁移文件。然后我需要使用该迁移来升级数据库......

使用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)

使用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) 解决此问题会导致失败,我已将其包含在底部,因为它与我的第二次尝试具有相同的堆栈跟踪。

尝试2:Flask-Alembic

此尝试发现我完全重写了我的cli_command upgrade headmain命令,但它并没有使用revision

使用Flask-Alembic创建修订文件(失败)

upgrade

这会导致错误与我之前尝试的错误相同。

两种情况下的堆栈跟踪:

(使用alembic 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))

作为回应,我进入了上述文件&在错误之前的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' 添加了一个打印件:

打印(self.charset)

L677

注意:如果我修改我的utf8 以使用其他ENGINE_URL,则此处会更改

所以现在我难倒了

PyMysql希望?charset=xxx具有属性self.charset,但encoding只是一个字符串。如何更改此操作以按预期运行?

帮助?

有效的答案是替代过程,尽管"最正确的"答案是帮我解决字符集/编码问题。

我的主要目标只是让我的烧瓶应用程序进行迁移。

0 个答案:

没有答案