【发布时间】:2019-02-24 14:51:43
【问题描述】:
我正在关注在线 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,它不会。所以问题似乎是烧瓶命令没有得到它应该读取 .flaskenv 文件中的信息,然后在迁移数据库时使用密码。发出命令时,我与 .flaskenv 文件位于同一目录中。另外,我可以手动登录数据库,所以我知道 .flaskenv 文件中的用户名和密码是正确的。
关于命令行选项的文档烧瓶非常简洁,没有给出如何指定数据库用户和密码的任何示例。那么如何强制“flask db migrate”命令使用正确的用户名和密码呢?
【问题讨论】:
-
能否提供教程的链接?
-
它是为 Udemy 课程付费的,所以它位于付费墙后面 (udemy.com/from-zero-to-flask)。但是,示例文件可在 github 上的github.com/fromzeroedu/itfc-visitor-counter 获得