【问题标题】:flask db init leads to "KeyError: 'migrate'flask db init 导致“KeyError:'migrate'
【发布时间】:2020-07-13 19:16:59
【问题描述】:

我已经创建了一个数据库并添加了 2 个表(地点、艺术家)。

这是来自我的 app.py 的派对:

import json
import dateutil.parser
import babel
from flask import Flask, render_template, request, Response, flash, redirect, url_for
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
import logging
from logging import Formatter, FileHandler
from flask_wtf import Form
from forms import *
from flask_migrate import Migrate
#----------------------------------------------------------------------------#
# App Config.
#----------------------------------------------------------------------------#
app = Flask(__name__)
moment = Moment(app)
app.config.from_object('config')
db = SQLAlchemy(app)
# TODO: connect to a local postgresql database
##Done via the config file
#----------------------------------------------------------------------------#
# Models.
#----------------------------------------------------------------------------#
#Migrate
migrate =(app,db)
class Venue(db.Model):
    __tablename__ = 'venue'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    city = db.Column(db.String(120))
    state = db.Column(db.String(120))
    address = db.Column(db.String(120))
    phone = db.Column(db.String(120))
    image_link = db.Column(db.String(500))
    facebook_link = db.Column(db.String(120))
    # TODO: implement any missing fields, as a database migration using Flask-Migrate
class Artist(db.Model):
    __tablename__ = 'artist'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    city = db.Column(db.String(120))
    state = db.Column(db.String(120))
    phone = db.Column(db.String(120))
    genres = db.Column(db.String(120))
    image_link = db.Column(db.String(500))
    facebook_link = db.Column(db.String(120))

在我的配置文件中创建连接。

如果我尝试在我的 app.py 和所有其他文件所在的目录中运行“flask db init”,我会收到以下错误:

directory = current_app.extensions['migrate'].directory

KeyError: 'migrate'

我试了好几个小时才知道,但到目前为止还没有找到解决办法。我究竟做错了什么?请帮帮我。

【问题讨论】:

    标签: python flask sqlalchemy migrate


    【解决方案1】:

    我认为你应该添加以下代码:

    migrate = Migrate(app, db) # this
    

    更多信息您可以查看link

    【讨论】:

    • 天啊!错过了...谢谢
    【解决方案2】:

    Flask 命令使用环境变量 FLASK_APP,来知道 Flask 应用程序的位置。对于您的应用程序,您必须设置 FLASK_APP=microblog.py,如第 1 章所述。

    来源 - https://www.kickstarter.com/projects/1124925856/the-new-and-improved-flask-mega-tutorial)

    俄罗斯 - Помните, что flask команда полагается на переменую среды FLASK_APP, чтобы знать, где расположено приложение Flask。 Для этого приложения вы хотите установить FLASK_APP=microblog.py, как описано в главе 1.

    【讨论】:

      【解决方案3】:

      你可以有这个设置

      """App factrory file"""
      from flask import Flask
      from flask_migrate import Migrate
      from app.config.config import APP_CONFIG
      from app.db.database import db
      
      def create_app():
          """App factory"""
          app = Flask(__name__)
          app.config.from_object(APP_CONFIG["development"])
          db.init_app(app)
          Migrate(app,db)
      
          # Register blueprint apps
          app.register_blueprint(homeViews)
      
          return app
      

      Flask migrate 必须将应用实例与 Sqlachemy 实例一起注入 对于环境变量,您可以在 .env

      FLASK_APP=yourapp.py
      FLASK_RUN_HOST="localhost"
      FLASK_RUN_PORT=
      FLASK_ENV=development
      FLASK_DB_USER=
      FLASK_DB_PASSWORD=
      FLASK_APP_SECRET_KEY=
      

      为了你的config.py

      from os import environ
      from dotenv import load_dotenv
      
      # Load environment variables
      load_dotenv()
      
      
      class DevelopmentConfig(object):
          """
          Development configuration just for local development
          """
          SQLALCHEMY_DATABASE_URI = f"postgresql://{environ.get('FLASK_DB_USER')}:\
              {environ.get('FLASK_DB_PASSWORD')}@localhost/db_name"
          SQLALCHEMY_TRACK_MODIFICATIONS = False
      
      
      class TestingConfig(object):
          """ Testing configuration just for local development"""
          ...
      
      
      class ProductionConfig(object):
          """ Deployment configuration for production development"""
          ...
      
      
      APP_CONFIG = {
          "development": DevelopmentConfig,
          "testing": TestingConfig,
          "production": ProductionConfig
      }
      

      设置完成后就可以运行了

      >>> flask db init
      >>> flask db migrate -m "Initial migrations"
      >>> flask db upgrade
      

      【讨论】:

        【解决方案4】:

        Migrate(app,db) 添加到您的项目中,然后从您的项目所在的文件夹外部运行flask db migrate 命令并设置flask 应用程序的位置:

        在 Windows 上--set FLASK_APP=/absolute/path/to/flask/app
        在 Linux 上 -- export FLASK_APP=/path/to/app/from/current/location
        然后尝试flask db migrate,它应该可以正常工作。

        【讨论】:

          猜你喜欢
          • 2021-10-29
          • 1970-01-01
          • 1970-01-01
          • 2019-06-04
          • 2021-08-11
          • 2015-07-15
          • 1970-01-01
          • 2021-08-30
          • 1970-01-01
          相关资源
          最近更新 更多