Flask-SQLAIchemy插件
另外一个框架Flask-SQLAIchemy,是对SQLAIchemy进行一个简单的封装,使得我们在Flask中使用sqlalchemy更加简单,可以通过pip install flask-sqlalchemy。
。数据库初始化:数据库初始化不再通过create_engine
1 from flask import Flask
2 from flask_sqlalchemy import SQLAlchemy
3 from constants import DB_URI
4 app = Flask(__name__)
5 app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
6 db = SQLAlchemy(app)
。ORM类:之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-SQLAIchemy中更加简单了
1 class User(db.Model):
2 id = db.Column(db.Integer,primary_key=True)
3 username = db.Column(db.String(80),unique=True)
4 email = db.Column(db.String(120),unique=True)
5
6 def __repr__(self):
7 return '<User %s>' % self.username
映射模型到数据库表:使用Flask-SQLAIchemy所有类都是继承自db.Model,并且所有的Column和数据类也都成为db的一个属性。但有个好处是不用写表名了,Flask-SQLAIchemy会自动将类名小写化,然后映射成表名。
写完模型后,要将模型映射到数据库的表名中,使用以下代码创建所有的表:
1 db.create_all()
。添加数据:这时候可以在数据库中看到已经生成了一个user表了。
1 admin = User('admin','admin@example.com')
2 guest = User('guest','guest@example.com')
3 db.session.add(admin)
4 db.session.add(guest)
5 db.session.commit()
。添加数据和之前的没有区别,只是session成为一个db的属性。
。查询数据不再是之前的session.query了,而是将query属性放在了db.Model.query的方式进行查询了
1 users = User.query.all()
。删除数据:删除数据跟添加数据类似,只不过session是db的一个属性而已:
1 db.session.delete(admin)
2 db.session.commit()
Flask-Script
Flask-Script 的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。要使用Flsk-Script,可以通过pip install flask-script 安装最新版本
1 from flask_script import Manager
2 from your_app import app
3
4 manager = Manager(app)
5
6 @manager.command
7 def hello():
8 print('hello')
9
10 if __name__ == '__main__':
11 manager.run()
我们把脚本命令代码放在一个叫做manage.py文件中,然后在终端运行python manage.py hello命令,就可以看到输出hello了
定义命令的三种方法
1.使用@command装饰器
2.使用类继承自Command类
1 from flask_script import Command,Manager
2 from your_app import app
3
4 manager = Manager(app)
5
6 class Hello(Command):
7 "prints hello world"
8
9 def run(self):
10 print("hello world")
11
12 manager.add_command('hello',Hello())
使用类的方式,有三点需要注意
。必须继承自Command基类
。必须实现run方法。
。必须通过方法添加命令。
3.使用option装饰器:如果想要在命令时还传递参数进去,那么使用@option装饰器更加方便
1 @manager.option('-n','--name',dest='name')
2 def hello(name):
3 print('hello ',name)
这样,调用hello命令
1 python manage.py -n juran
2 python manage.py --name juran
添加参数到命令中
。option装饰器:以上三种创建命令方式都可以添加参数, @option装饰器,已经介绍过了
1 @manager.option('-n', '--name', dest='name', default='joe')
2 @manager.option('-u', '--url', dest='url', default=None)
3 def hello(name, url):
4 if url is None:
5 print("hello", name)
6 else:
7 print("hello", name, "from", url)
。command装饰器:command装饰器也可以添加参数,但是不能那么的灵活
1 @manager.command
2 def hello(name="Fred")
3 print("hello", name)
。类继承:类继承也可以添加参数
1 from flask_Flask import Comman,Manager,Option
2
3 class Hello(Command):
4 option_list = (
5 Option('--name','-n',dest='name'),
6 )
7
8 def run(self,name):
9 print("hello %s" % name)
如果要在指定参数时,动态的做一些事情,可以使用get_options方法
1 class Hello(Command):
2 def __init__(self,default_name='Joe'):
3 self.default_name = default_name
4
5 def get_options(self):
6 return [
7 Option('-n','--name',dest='name',default=self.default_name),
8 ]
9
10 def run(self,name):
11 print('hello',name)
Flask-Migrate
在实际的开发环境中,经常会发生数据库修改的行为。一般不会手动去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。这时如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate就是组这个事情的。flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实是Alembic做的,它能跟踪模型的变化,并将变化映射到数据库中。
使用Flask-Migrate需要安装
1 pip install flask-migrate
要让Flask-Migrate能够管理app中的数据库,需要使用Migrate(app,db)来绑定app和数据库
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from constants import DB_URI
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
# 绑定app和数据库
migrate = Migrate(app,db)
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(20))
addresses = db.relationship('Address',backref='user')
class Address(db.Model):
id = db.Column(db.Integer,primary_key=True)
email_address = db.Column(db.String(50))
user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
db.create_all()
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
初始化一个迁移文件夹
1 flask db init
然后再把当前的模型添加到迁移文件中
1 flask db migrate
最后再把迁移文件中对应的数据库操作,真正的映射到数据库中
1 flask db upgrade
manage.py文件
这个文件用来存放映射数据库的命令,MigrateCommand是flask-migrate集成的一个命令,因此想要添加到脚本命令中,想要采用manager.add_command('db',MigrateCommand)的方式,以后运行python manager.py dbxxx的命令,其实就是执行MigrateCommand。
1 from flask_script import Manager
2 from flask_migrate import MigrateCommand, Migrate
3 from exts import db
4 from demo import app
5 from models import User
6
7 manage = Manager(app)
8 Migrate(app, db)
9 manage.add_command("db", MigrateCommand)
10
11 if __name__ == '__main__':
12 manage.run()