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