20201104-第十一讲-Flask-SQLAIchemy插件、Flask-Script、Flask-Migrate、Flask-补充WTForms表单验证

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

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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容