В Flask-migrate ValueError: недопустимый синтаксис интерполяции в строке соединения в позиции 15

Я использую flask migrate для создания базы данных и миграции в колбе с колбой-sqlalchemy.

все работало нормально, пока я не изменил пароль пользователя базы данных, содержащий"@", затем он перестал работать, поэтому я обновил свой код на основе пишем строку подключения, когда пароль содержит специальные символы

он работает для приложения, но не для Flask-миграции, показывая ошибку при миграции

Я.E on 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 ответов


на 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). Поэтому необработанный знак процента, не являющийся частью символа интерполяции, должен быть экранирован, например %%. Данное значение может ссылаться на другое значение уже в файле, используя формат интерполяции.


У меня есть решение для этой проблемы после ее возникновения.

существует проблема с " % " (Знаки процента) в URI подключения к БД после urlencode строки.

Я попытался заменить знак процента двойными знаками процента ( "% % " ), что позволяет мне преодолеть ошибку интерполяции. Однако это привело к невозможности подключения к базе данных из-за неправильного пароля.

решение, с которым я собираюсь сейчас, - это избежать использования " % " в мой пароль БД. Не удовлетворительное решение, но пока сойдет. Я сделаю заметку в github "перегонного куба" этого вопроса. Кажется, использование RawConfigParser в их пакете может помочь избежать этой проблемы.


вы можете посмотреть наhttp://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicode У меня была такая же проблема с моим паролем и разъем MySQL. использование MySQL+pymysql connector позволило мне подключиться в приложении и в сценариях миграции.