我正在学习在线 Flask 教程,但在您进行第一次数据库迁移时卡住了。在命令下
$ flask db migrate
我收到错误信息
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError)
(1045, "Access denied for user 'counter_app'@'localhost' (using password: NO)")
(Background on this error at: http://sqlalche.me/e/e3q8)
不幸的是,错误消息中的链接没有提供足够的帮助,但我很确定我知道问题出在哪里。通过命令,我尝试在不使用密码的情况下连接到数据库(“使用密码:否”),但是,对于有问题的用户“counter_app”,在 .flaskenv 文件中设置了一个密码,如下所示:
FLASK_APP='manage.py'
FLASK_ENV=development
SECRET_KEY='my_secret_key'
DB_HOST=localhost
DB_USERNAME='counter_app'
DB_PASSWORD='mypassword'
DATABASE_NAME='counter'
文件appklication.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
# setup db
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
# Load config
app.config.from_pyfile('settings.py')
# initialize db
db.init_app(app)
migrate = Migrate(app, db)
# import blueprints
from counter.views import counter_app
# register blueprints
app.register_blueprint(counter_app)
return app
然后通过 app.config.from_pyfile('settings.py') 加载; settings.py 看起来像这样:
import os
SECRET_KEY = os.getenv('SECRET_KEY')
DB_USERNAME=os.environ['DB_USERNAME']
DB_PASSWORD=os.environ['DB_PASSWORD']
DB_HOST=os.environ['DB_HOST']
DATABASE_NAME=os.environ['DATABASE_NAME']
DB_URI = 'mysql+pymysql://%s:%s@%s:3306/%s' % (DB_USERNAME, DB_PASSWORD, DB_HOST, DATABASE_NAME)
SQLALCHEMY_DATABASE_URI = DB_URI
如果这正常工作,这个序列应该设置 DB_USERNAME,它确实如此,但它也应该设置 DB_PASSWORD,但它没有。所以问题似乎是 flask 命令没有得到它应该读取 .flaskenv 文件中的信息,然后在迁移数据库时使用密码。发出命令时,我与 .flaskenv 文件位于同一目录中。此外,我能够手动登录数据库,因此我知道 .flaskenv 文件中的用户名和密码是正确的。
有关命令行选项的文档 flask 非常简洁,没有给出任何如何指定数据库用户和密码的示例。那么如何强制“flask db migrate”命令使用正确的用户和密码呢?
最佳答案
我是类(class)的作者。出现的问题是 Homebrew 上 MySQL 的最新软件包已更新为安装 MySQL 8.0。本类(class)假定您正在安装 MySQL 5.7,这是一个月前的默认 Homebrew 软件包。
要解决此问题,请在您的本地系统中安装特定版本的 MySQL。
如果您已经安装了它,请先卸载,使用 brew remove mysql
。
然后,使用 brew install mysql@5.7
安装。
问题是 MySQL 8.0+ 有一个新的身份验证机制,可以自动加密密码。
如果您仍想使用 MySQL 8.0,可以通过执行以下操作更改 counter_app
用户以使用密码:
ALTER USER 'counter_app'@'%' IDENTIFIED WITH mysql_native_password BY 'mypassword';
或者,如果您想从头开始创建它,请执行以下操作:
CREATE USER 'counter_app'@'%' IDENTIFIED WITH mysql_native_password BY 'mypassword';
关于python - 如何将有关用户和密码的信息传递给命令 'flask db migrate',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54853093/