Python 将Flask迁移与Flask安全性一起使用

Python 将Flask迁移与Flask安全性一起使用,python,flask,flask-sqlalchemy,flask-security,flask-migrate,Python,Flask,Flask Sqlalchemy,Flask Security,Flask Migrate,我正在尝试一个基本的Flask安全应用程序与Flask迁移一起工作。我有两个主要的py文件:app.py和db_migrate.py app.py: db_migrate.py: 我试着运行app.py。它在本地主机上正常工作,但当我尝试登录用户时,会出现以下错误: OperationalError:OperationalError没有这样的表:user u'选择user.id作为user\u id,user.email作为user\u email,user.password作为user\u密码

我正在尝试一个基本的Flask安全应用程序与Flask迁移一起工作。我有两个主要的py文件:app.py和db_migrate.py

app.py: db_migrate.py: 我试着运行app.py。它在本地主机上正常工作,但当我尝试登录用户时,会出现以下错误:

OperationalError:OperationalError没有这样的表:user u'选择user.id作为user\u id,user.email作为user\u email,user.password作为user\u密码,user.active作为user\u active,user.confirmed\u at作为user\u confirmed\u at,user.favcolor作为user\u favcolor\n从user\n到lowerser.email LIKE lower\n下限在哪里?偏移量“u”xxx@xxx.com,1,0

基本上,我怀疑我是否正确创建了user_数据存储和安全性,因为我可能不应该以这种方式导入用户和角色,但我不确定如何正确访问它们

编辑:

由于建议,我添加了最后一个命令:

python db_manager.py db ugrade
但是,现在我在尝试通过电子邮件确认用户注册时出现以下错误:


InvalidRequestError:对象已附加到会话“1”这是“3”

Flask Migrate/Alembic的工作流如下所示:

数据库初始化

这在创建迁移存储库时只执行一次,以后不再执行

数据库迁移

运行此命令可生成迁移脚本。该命令的输出将告诉您迁移脚本是在哪里创建的,并显示其中内容的摘要。您的数据库在此阶段尚未修改

查看迁移脚本

这是非常重要的。自动迁移并不完美,您必须检查生成的脚本并进行必要的更正

数据库升级

这将迁移应用到数据库,有效地进行必要的模式更改

现在可以使用数据库了。对模型进行更多更改后,返回步骤2并重复该循环

根据您的描述,您可能错过了第4步,即升级呼叫


作为补充说明,您的两个脚本之间存在一些重复,您应该尝试合并它们。看看人们是如何在多个模块或包之间构建Flask应用程序的。

Flask Migrate/Alembic的工作流程如下:

数据库初始化

这在创建迁移存储库时只执行一次,以后不再执行

数据库迁移

运行此命令可生成迁移脚本。该命令的输出将告诉您迁移脚本是在哪里创建的,并显示其中内容的摘要。您的数据库在此阶段尚未修改

查看迁移脚本

这是非常重要的。自动迁移并不完美,您必须检查生成的脚本并进行必要的更正

数据库升级

这将迁移应用到数据库,有效地进行必要的模式更改

现在可以使用数据库了。对模型进行更多更改后,返回步骤2并重复该循环

根据您的描述,您可能错过了第4步,即升级呼叫


作为补充说明,您的两个脚本之间存在一些重复,您应该尝试合并它们。看看人们是如何跨多个模块或包构建Flask应用程序的。

谢谢!我也采纳了你的建议,因为代码正在创建2个数据库连接。谢谢!我也采纳了您的建议,因为代码正在创建2个数据库连接。
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin

import os
basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'app.db')

db = SQLAlchemy(app)
migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

# Define models
roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    favcolor = db.Column(db.String(255))
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

    def __str__(self):
        return '<User id=%s email=%s>' % (self.id, self.email)

if __name__ == '__main__':
    manager.run()
python db_manager.py db init
python db_manager.py db migrate
python db_manager.py db ugrade