在 Flask-migrate ValueError 中:位置 15 的连接字符串中的插值语法无效
Posted
技术标签:
【中文标题】在 Flask-migrate ValueError 中:位置 15 的连接字符串中的插值语法无效【英文标题】:In Flask-migrate ValueError: invalid interpolation syntax in connection string at position 15 【发布时间】:2017-02-12 11:06:17 【问题描述】:我正在使用 flask migrate
在带有 flask-sqlalchemy 的烧瓶中创建数据库和迁移。
一切正常,直到我更改我的数据库用户密码包含'@'然后它停止工作,所以我更新了我的代码基于 Writing a connection string when password contains special characters
它适用于应用程序但不适用于烧瓶迁移,迁移时显示错误
即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
请帮忙
【问题讨论】:
【参考方案1】:在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)
另见the documentation of set_main_option:
请注意,此值将传递给 ConfigParser.set,它支持使用 pyformat 进行变量插值(例如 %(some_value)s)。因此,必须转义不属于插值符号的原始百分号,例如%%。给定的值可能使用插值格式引用文件中已有的另一个值。
【讨论】:
【参考方案2】:在遇到这个问题后,我也有解决方案。
对字符串进行 urlencode 后,数据库连接 URI 中的“%”(百分号)存在问题。
我尝试用双百分号 ('%%') 代替百分号,这让我克服了插值错误。但是,由于密码错误,导致无法连接到数据库。
我现在采用的解决方案是避免在我的数据库密码中使用“%”。不是一个令人满意的解决方案,但现在可以。我会在“alembic”的 github 上记下这个问题。似乎在他们的包中使用 RawConfigParser 可以帮助避免这个问题。
【讨论】:
这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review 我不是在问问题。我不想引起注意。我正在为那些也搜索并最终找到此问题的人提供信息。【参考方案3】:你可能想看看http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicode 我的密码和mysql连接器也有同样的问题。使用 mysql+pymysql 连接器允许我在应用程序和迁移脚本中进行连接。
【讨论】:
以上是关于在 Flask-migrate ValueError 中:位置 15 的连接字符串中的插值语法无效的主要内容,如果未能解决你的问题,请参考以下文章