在Flask-migrate中,ValueError:位置15的连接字符串中的无效插值语法

ani*_*ils 9 python mysql connection-string flask-sqlalchemy flask-migrate

我正在使用flask migrateflask-sqlalchemy进行数据库创建和迁移.

一切都工作正常,直到我更改我的数据库用户密码包含'@'然后它停止工作所以,我更新了我的代码基于 写密码包含特殊字符时的连接字符串

它适用于应用但不适用于烧瓶迁移,它在迁移时显示错误

python manage.py db migrate

ValueError: invalid interpolation syntax in u'mysql://user:p%40ssword@localhost/testdb' at position 15
Run Code Online (Sandbox Code Playgroud)

密码在这里被p@ssword转义urlquote(见上面的问题链接).

完整错误堆栈:

Traceback (most recent call last):
  File "manage.py", line 20, in <module>
    manager.run()
  File "/usr/local/lib/python2.7/dist-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/usr/local/lib/python2.7/dist-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/usr/local/lib/python2.7/dist-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/flask_migrate/__init__.py", line 177, in migrate
    version_path=version_path, rev_id=rev_id)
  File "/usr/local/lib/python2.7/dist-packages/alembic/command.py", line 117, in revision
    script_directory.run_env()
  File "/usr/local/lib/python2.7/dist-packages/alembic/script/base.py", line 407, in run_env
    util.load_python_file(self.dir, 'env.py')
  File "/usr/local/lib/python2.7/dist-packages/alembic/util/pyfiles.py", line 93, in load_python_file
    module = load_module_py(module_id, path)
  File "/usr/local/lib/python2.7/dist-packages/alembic/util/compat.py", line 79, in load_module_py
    mod = imp.load_source(module_id, path, fp)
  File "migrations/env.py", line 22, in <module>
    current_app.config.get('SQLALCHEMY_DATABASE_URI'))
  File "/usr/local/lib/python2.7/dist-packages/alembic/config.py", line 218, in set_main_option
    self.set_section_option(self.config_ini_section, name, value)
  File "/usr/local/lib/python2.7/dist-packages/alembic/config.py", line 245, in set_section_option
    self.file_config.set(section, name, value)
  File "/usr/lib/python2.7/ConfigParser.py", line 752, in set
    "position %d" % (value, tmp_value.find('%')))
ValueError: invalid interpolation syntax in u'mysql://user:p%40ssword@localhost/testdb' at position 15
Run Code Online (Sandbox Code Playgroud)

请帮忙

Okk*_*kke 21

在该migrations/env.py文件中,您将找到负责此问题的代码.

config.set_main_option('sqlalchemy.url',
                       current_app.config.get('SQLALCHEMY_DATABASE_URI'))
Run Code Online (Sandbox Code Playgroud)

如果有%迹象SQLALCHEMY_DATABASE_URI,这将导致错误.

您可以通过编辑migrations/env.py文件并更改违规行来解决此问题,如下所示

db_url_escaped = current_app.config.get('SQLALCHEMY_DATABASE_URI').replace('%', '%%')
config.set_main_option('sqlalchemy.url', db_url_escaped)
Run Code Online (Sandbox Code Playgroud)

另请参阅set_main_option的文档:

请注意,此值将传递给ConfigParser.set,后者支持使用pyformat进行变量插值(例如%(some_value)s).因此,必须转义不是插值符号一部分的原始百分号,例如%%.给定值可以使用插值格式引用文件中已经存在的另一个值.


Adé*_*Adé 7

我也经历过这个问题后有一个解决方案。

对字符串进行 urlencode 后,数据库连接 URI 中的“%”(百分号)出现问题。

我尝试用双百分号('%%')替换百分号,这让我克服了插值错误。但是,这导致由于密码不正确而无法连接到数据库。

我现在要采用的解决方案是避免在数据库密码中使用“%”。这不是一个令人满意的解决方案,但暂时可以。我会在“alembic”的 github 上记录这个问题。似乎在他们的包中使用 RawConfigParser 可以帮助避免这个问题。

  • 我不是在问问题。我并不是想引起注意。我正在为那些也搜索过并最终找到这个问题的人提供信息。 (9认同)
  • 这并不能真正回答问题。如果您有其他问题,可以通过单击[提问](http://stackoverflow.com/questions/ask) 来提问。一旦你有足够的[声誉](http://stackoverflow.com/help/),你还可以[添加赏金](http://stackoverflow.com/help/privileges/set-bounties)来吸引更多人关注这个问题什么是声誉)。- [来自评论](/review/low-quality-posts/14423800) (2认同)