Как передать информацию о пользователе и пароле в команду 'flask db migrate' - PullRequest
0 голосов
/ 24 февраля 2019

Я следую интерактивному учебнику 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 db migrate' использовать правильного пользователя и пароль?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Я автор курса.Проблема, которая возникла, заключается в том, что последние пакеты для MySQL на Homebrew были обновлены для установки MySQL 8.0.В курсе предполагается, что вы устанавливаете 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';

0 голосов
/ 24 февраля 2019

Чтобы использовать конфигурационные точечные файлы .env и .flaskenv, необходимо установить и настроить python-dotenv.

python-dotenv: Начало работы

колба: переменные среды от dotenv

Вместо того, чтобы иметь отдельный .flaskenv, большинство проектов, которые я видел, имеют один .env файл, содержащий все секреты приложения, которыехранится вне контроля версий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...