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


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

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

Он работает для приложения, но не для миграции колбы, его ошибка отображения при миграции

То есть на 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 6

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 позволило мне подключаться в приложениях и в сценариях миграции.