20

私はflask migrateフラスコでのデータベースの作成と移行にフラスコ-sqlalchemyを使用しています。

データベースユーザーのパスワードに「@」が含まれているように変更するまで、すべてが正常に機能していましたが、機能しなくなったため、パスワードに特殊文字が含まれている場合の接続文字列の書き込みに基づいてコードを更新しました

アプリケーションでは機能しますが、フラスコ移行では機能しません。移行中にエラーが表示されます

つまりオンpython manage.py db migrate

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

ここで password isp@sswordとそのエスケープ by 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

助けてください

4

3 に答える 3

33

この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) を使用した変数補間をサポートします。したがって、補間記号の一部ではない生のパーセント記号は、%% のようにエスケープする必要があります。指定された値は、補間形式を使用してファイル内に既にある別の値を参照する場合があります。

于 2017-10-18T09:45:27.477 に答える
3

私もそれを経験した後、この問題の解決策があります。

文字列を urlencode した後、db 接続 URI の '%' (パーセント記号) に問題があります。

パーセント記号を 2 つのパーセント記号 ('%%') に置き換えて、補間エラーを回避しようとしました。ただし、パスワードが正しくないため、データベースに接続できませんでした。

私が今行っている解決策は、db パスワードに「%」を使用しないことです。満足のいく解決策ではありませんが、今のところ問題ありません。問題の「alembic」の github にメモを作成します。パッケージで RawConfigParser を使用すると、この問題を回避できるようです。

于 2016-11-28T05:14:54.840 に答える
-1

http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicodeを参照してください 。パスワードと mysql コネクタで同じ問題が発生しました。mysql+pymysql コネクタを使用すると、アプリケーションと移行スクリプトで接続できました。

于 2017-02-28T16:31:55.113 に答える