在过去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查看我的所有模型现在已经转换为包含列和关系的表。
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()
此时我有一个完全按照预期创建的迁移文件。然后我需要使用该迁移来升级数据库......
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)
解决此问题会导致失败,我已将其包含在底部,因为它与我的第二次尝试具有相同的堆栈跟踪。
此尝试发现我完全重写了我的cli_command upgrade head
和main
命令,但它并没有使用revision
。
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'
添加了一个打印件:
L677
注意:如果我修改我的utf8
以使用其他ENGINE_URL
,则此处会更改 。
PyMysql希望?charset=xxx
具有属性self.charset
,但encoding
只是一个字符串。如何更改此操作以按预期运行?
有效的答案是替代过程,尽管"最正确的"答案是帮我解决字符集/编码问题。
我的主要目标只是让我的烧瓶应用程序进行迁移。