在Flask-migrate中出现了ValueError:无效的插值语法,该连接字符串的位置在第15位。

25

我正在使用flask migrate和flask-sqlalchemy一起创建和迁移数据库。

一切都很顺利,直到我修改了我的数据库用户密码,其中包含'@',然后它停止工作,所以我根据编写包含特殊字符的连接字符串更新了我的代码。

它对应用程序有效,但对于flask-migration则无效,它在迁移时显示错误。

即在python manage.py db migrate时。

ValueError: invalid interpolation syntax in u'mysql://user:p%40ssword@localhost/testdb' at position 15

这里的密码是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
请帮忙。
3个回答

43
migrations/env.py文件中,您将找到负责此问题的代码。
config.set_main_option('sqlalchemy.url',
                       current_app.config.get('SQLALCHEMY_DATABASE_URI'))

如果在 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)

还请参见set_main_option的文档

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


7

在经历了这个问题之后,我有一个解决方案。

在urlencode字符串后,db连接URI中的“%”(百分号)存在问题。

我尝试用双百分号(“%%”)替换百分号,这使我避免了插值错误。然而,那会导致由于密码不正确而无法连接到数据库。

目前我采用的解决方案是避免在我的db密码中使用“%”。虽然不是理想的解决方案,但暂时可以使用。我将在“alembic”的github���备注此问题。似乎在他们的软件包中使用RawConfigParser可以避免此问题。


1
这并没有真正回答问题。如果你有不同的问题,可以通过点击提问来询问。一旦你获得了足够的声望,你也可以添加赏金以吸引更多关注。- [来自评论区的审查] (/review/low-quality-posts/14423800) - K Scandrett
9
我不是在提问,也不是想引起关注。我为那些同样寻找答案并最终找到这个问题的人提供信息。 - Adé

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接