毫无疑问,我正在Flask中使用Flask-Migrate
进行迁移。
一旦执行python manage.py db init
,它将创建带有初始迁移文件的目录migrations
。然后
我执行python manage.py db migrate
,我得到了:
...
...
target_metadata = current_app.extensions['migrate'].db.metadata
AttributeError: 'NoneType' object has no attribute 'metadata'
从此输出中我知道'migrate'是None
,因此出现属性错误。
models.py:
from sqlalchemy.sql import func
from project import db, bcrypt
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(128), nullable=False, unique=True)
email = db.Column(db.String(128), nullable=False, unique=True)
password = db.Column(db.String(255), nullable=False)
active = db.Column(db.Boolean(), default=True, nullable=False)
created_date = db.Column(db.DateTime, default=func.now(), nullable=False)
def __init__(self, username, email, password):
self.username = username
self.email = email
self.password = bcrypt.generate_password_hash(password).decode()
def to_json(self):
return {
'id': self.id,
'username': self.username,
'email': self.email,
'active': self.active,
}
问题是为什么什么都没有传递给它?我正在学习教程,因此不应该出现此错误。
我是从类似的话题中得到的:
NoneType表示代替任何Class或Object的实例 您以为您正在与之合作,实际上您没有任何人。那通常 表示上面的分配或函数调用失败或返回 意外的结果。
这是我在迁移目录的env.py文件中找到的内容:
from flask import current_app
config.set_main_option('sqlalchemy.url',
current_app.config.get('SQLALCHEMY_DATABASE_URI'))
target_metadata = current_app.extensions['migrate'].db.metadata
current_app
是从Flask导入的,但不包含我需要使用元数据的扩展名migrate
。
尽管由于扩展名已在None
文件中正确初始化,所以没有理由抛出__init__.py
:
...
...
from flask_migrate import Migrate
db = SQLAlchemy()
toolbar = DebugToolbarExtension()
cors = CORS()
migrate = Migrate()
bcrypt = Bcrypt()
def create_app(script_info=None):
app = Flask(__name__)
app_settings = os.getenv('APP_SETTINGS')
app.config.from_object(app_settings)
app.config.from_object('project.config.DevelopmentConfig')
toolbar.init_app(app)
cors.init_app(app)
db.init_app(app)
migrate.init_app(app) # <--
bcrypt.init_app(app)
from project.api.users import users_blueprint
app.register_blueprint(users_blueprint)
@app.shell_context_processor
def ctx():
return {'app': app, 'db': db}
return app
答案 0 :(得分:0)
在migrate
扩展名的初始化中缺少参数。迁移接受app
实例和 db
实例。
def create_app(script_info=None):
app = Flask(__name__)
app_settings = os.getenv('APP_SETTINGS')
app.config.from_object(app_settings)
app.config.from_object('project.config.DevelopmentConfig')
toolbar.init_app(app)
cors.init_app(app)
db.init_app(app)
migrate.init_app(app, db) # <--
bcrypt.init_app(app)
from project.api.users import users_blueprint
app.register_blueprint(users_blueprint)
@app.shell_context_processor
def ctx():
return {'app': app, 'db': db}
return app