python - 如何将有关用户和密码的信息传递给命令 'flask db migrate'

标签 python mysql flask

我正在学习在线 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/

相关文章:

python - 元组的元素本身就是元组吗?

python - 如何在 python 中发现特定包中的类?

mysql - 让 SQL 选择最后一个非零金额

带有多个参数的 Python 打印与打印 fstring

php - Mysql:ON DUPLICATE KEY UPDATE 抛出错误

mysql : table1 field value as name for table2

python - 从最后一个索引开始查询数据库 SQLAlchemy

python - Flask - 数据创建

python - 从 Flask 脚本管理器中获取调试状态

python - 如何将一个 float 元组写入文件空间,只用一次调用在 python 中写入?