Flask学习5:模型

数据模型

数据库回顾

1.分类

​关系型数据库:MySQL、Oracle、SQLite、…

非关系型数据库:MongoDB、Redis、…

2.选择

​数据库没有好坏,要根据项目需求进行选择:盲目的评价或跟风只能证明不够

flask-sqlalchemy

1.说明

​提供了大多数关系型数据库的支持,而且提供了ORM(对象关系映射)

2.安装

pip install flask-sqlalchemy

3.连接配置

​指定数据库地址

MySQL:mysql://username:password@host/database

SQLite:
        windows:sqlite:///c:/path/to/database
         linux:sqlite:////c:/path/to/database

配置选项:
        SQLACHEMY_DATABASE_URI

4.使用:

from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
manager = Manager(app)

# 配置数据库连接地址
import os
# 当前路径
base_dir = os.path.abspath(os.path.dirname(__file__))
# 连接地址
database_uri = 'sqlite:///' + os.path.join(base_dir, 'data.sqlite')
app.config['SQLALCHEMY_DATABASE_URL'] = database_uri

# 创建对象
db = SQLAlchemy(app)

5.添加数据模型

# 继承自特定的基类
# 定义模型类
class User(db.Model):
    # 不指定表明,默认会将大驼峰转换为小写+下划线风格
    # 如:类名为UserModel =》user_model

    # 指定表名
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(32), unique=True)
    email = db.Column(db.String(64), unique=True)

6.创建表、删除表

# 创建表,若是sqlite没有数据库时会自动创建,若是MySQL会报错
@app.route('/')
def index():
    # 删除表
    db.drop_all()
    # 创建表
    db.create_all()

    return 'Nice day!'

7.添加命令行删除表和创建表

from flask_script import prompt_bool

# 创建表python model.py createall
@manager.command
def createall():
    db.drop_all()
    db.create_all()
    return '数据表已创建'

# 删除表python model.py dropall
@manager.command
def dropall():
    if prompt_bool('确定要删库跑路吗?'):
        db.drop_all()
        return '数据表已删除'
    return '还是在考虑一下吧'

创建表:python model.py createall
删除表:python model.py dropall

8.自定义终端shell命令

原因是:系统默认有一个shell命令,启动后可以进行终端测试,但是没有导入任何数据,因此需要自己定制。

# 定制shell
def shell_context():
    # 返回在shell环境中需要的数据,以字典的形式返回
    return dict(db=db, User=User)
manager.add_command('shell',Shell(make_context=shell_context))

数据的CURD操作

1.增加数据

# 在请求结束后,自动提交数据库操作(执行commit),否则每次都要手动commit
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

# 添加数据
@app.route('/insert/')
def insert():
    # 创建数据模型
    # zhangsan = User(username='zhangsan',, sex=False,)
    # lisi = User(username='lisi',, sex=False,)
    # mazi = User(username='mazi',, sex=False,)
    xjt = User(username='xjt',, sex=False,)

    # 添加到会话中
    db.session.add(xjt)
    # 添加多个
    # db.session.add_all([zhangsan, lisi, mazi])

    # 提交
    db.session.commit()  # 如果设置了SQLALCHEMY_COMMIT_ON_TEARDOWN就不用手动commit了
    return '已经添加'

2.查询数据

# 根据主键查询数据
@app.route('/select/<uid>')
def select(uid):
    # 根据主键进行查询,如果有,返回User对象,没有None
    u = User.query.get(uid)
    if u:
        return u.username
    return '查无此人'

3.更新数据

# 修改(更新)数据
@app.route('/update/<uid>')
def update(uid):
    u = User.query.get(uid)
    if u:
        u.username = u.username + 'Copy'
        # 更新没有单独的函数,当添加的对象有id时被认为时更新操作
        db.session.add(u)
        # db.session.commit()
        return '修改完成'
    return '查无此人'

4.删除数据

# 删除数据
@app.route('/delete/<uid>')
def delete(uid):
    u = User.query.get(uid)
    if u:
        db.session.delete(u)
        return '删除成功'
    return '查无此人'

真是的项目很少用到物理删除(彻底从磁盘删掉),大多数都是使用逻辑删除(打标记)

5.各种查询

# 各种查询
@app.route('/selectby/')
def select_by():
    # 根据主键进行查询
    # u = User.query.get(2)
    # return u.username

    # 查询所有满足条件的
    # users = User.query.all()
    # return ','.join([u.username for u in users])

    # 指定过滤条件(只能是等值条件)
    # u = User.query.filter_by(username='Dandan').first()
    # return u.username

    # 指定过滤条件(可以是等值条件)
    # u = User.query.filter(User.id > 2).first()
    # u = User.query.filter(User.id == 2).first()
    # return u.username

    # 有就返回,没有报404
    # u = User.query.get_or_404(8)
    # u = User.query.filter(User.id > 8).first_or_404()
    # return u.username

    # 数据统计
    total = User.query.count()
    return str(total)

自行测试:limit, offset, order_by, paginate

模型设计参考

1.常见的字段类型

2.常见选项

3.总结

1.插入数据时,可以不传值的情况:自增的主键、有默认值、可以为空
2.flask-sqlalchemy:要求每个模型都有一个主键,通常为id

数据库的迁移

1.说明

​当数据模型更改时,需要将更改应用到数据库,这个过程叫数据库迁移。

​直接删除,然后再创建太过于简单粗暴,副作用大(原来的数据全部丢失)

​更好的解决方案是:既能将修改应用到数据库,又不删除原来的数据,若自己不会,可以采用flask-migrate扩展库.

2.安装

pip install flask-migrate

3.配置

from flask_migrate import Migrate, MigrateCommand

# 创建对象
migrate = Migrate(app, db)

# 添加终端命令
manager.add_command('db', MigrateCommand)

4.使用

1.初始化数据库迁移的仓库,执行一次就行了
    python manage.py db init
2.创建迁移脚本,会根据数据模型与数据库的表的差异生成sql语句
    python manage.py db migrate
3.执行迁移,就是执行上面生成的sql语句
    python manage.py upgrade
4.以后再迁移,只需2、3两步即可
标签:Flask 发布于:2019-10-21 12:59:25