1.flask_script管理应用
(1)安装flask_script
pip intall flask_script
(2)配置
from flask_script import Manager
app = Flask(__name__)
db = SQLAlchemy(app)
manage = Manager(app)
if __name__ == '__main__':
manage.run()
注意,这时候的启动服务已经不是app.run()了,而是manage.run()
启动服务器的命令如下:
python 文件名 runserver -p 端口号
2.进行迁移数据库
(1)安装flask-migrate
pip install flask-migrate
(2)在flask-scripth中增加迁移命令,并且起别名
from flask_migrate import Migrate,MigrateCommand
manage.add_command('db',MigrateCommand)
(3)创建migrate实例
#设置迁移Migrate对象,第一个是app应用,第二个参数是数据库操作句柄
migrate = Migrate(app,db)
(4)创建迁移仓库
python qianyi.py db_command init
创建完成后将会多出一个文件夹,名字为migrations
(5)创建迁移文件
python 文件名 db migrate -m '注释'
执行完成后会生成一个版本号,可以用来回滚版本
这个时候在上一步的文件夹中的versions里生成了一个迁移文件
(6)更新数据库
python 文件名 db upgrade
此时,数据库中就产生了新的表
(7)补充
查看历史版本
python 文件名 db history
回滚版本
python 文件名 db_command downgrade 版本号
3.所有的代码
from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
app = Flask(__name__)
app.secret_key='asfasfnjdfpogmkinbeoaq'
# 用于连接数据库的URI
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:0529@127.0.0.1:3306/flasktest'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
# 创建用来管理数据库的对象(操作句柄),注意参数需要和app产生联系
db = SQLAlchemy(app)
manage = Manager(app)
manage.add_command('db',MigrateCommand)
migrate = Migrate(app,db)
# 一对多
class Role(db.Model):
__tablename__='roles'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20),unique=True)
# 还要在主表上添加关系,与用户表产生关系,代表这个角色下所有的用户
# users = db.relationship('User',backref = 'role',lazy='subquery')
users = db.relationship('User',backref = 'role',lazy='dynamic')
def __repr__(self):
return "<Role %s>"%self.name
class User(db.Model):
__tablename__='user'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20),unique=True)
is_delete = db.Column(db.Boolean,default=False)
email = db.Column(db.String(30),nullable=True)
# 外键:添加的时候要指定表名和字段
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
def __repr__(self):
return "<User %s>"%self.name
if __name__ == '__main__':
manage.run()