PYTHON 八月 19, 2019

第7节、model01以及拆分MVT

文章字数 8.1k 阅读约需 7 mins. 阅读次数 1000000

一、Model

flask作为一款MVT的框架,也具有ORM模型的操作,通过扩展库(flask-sqlalchemy)来实现。

随着项目越来越大,采用原生sql的话,就会出现大量的原生sql语句。

ORM模型的好处:

  1. SQL语句重复使用率低,越复杂的sql语句,语句就越长,会出现很多相似的sql语句
  1. 很多sql语句都是根据业务逻辑拼接出来的,如果数据库发生了修改,那么这些逻辑就需要重写 这样就会漏掉某些sql的更改
  2. 原生SQL容易漏掉,对sql语句安全性的考虑

工作原理:
ORM 是对象关系的映射,我们可以通过类的方式去操作数据库,不再使用原生的SQL语句了。ORM中的类映射数据库中的每个表,类中的每个属性映射成表中的每个字段。ORM最终还是会将开发者操作的增删改查的代码转换成sql语句,再去操作数据库。

好处:

  1. 可以使用简短的代码写出比较复杂的SQL语句
  2. 可以减少重复sql语句的概率
  3. 可移植性好,只需要更改settings.py的配置sqlite,mysql等

二、原生SQL

(1) 创建数据库 python1807

create database if not exists python1807 character set utf8;

(2) 安装pymysql模块

pip install pymysql

(3) 安装flask-sqlalchemy

pip install flask-sqlalchemy

(4) 配置链接数据库的URI地址

#配置链接数据库的URI地址
HOST = '127.0.0.1'
USER = 'root'
PASSWORD = '123456'
PORT = '3306'
NAME = 'python1807'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USER,PASSWORD,HOST,PORT,NAME)

实例

from sqlalchemy import create_engine

#配置链接数据库的URI地址
HOST = '127.0.0.1'
USER = 'root'
PASSWORD = '123456'
PORT = '3306'
NAME = 'python1807'

DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USER,PASSWORD,HOST,PORT,NAME)

#创建sqlalchemy操作数据库引擎
engine = create_engine(DB_URI)

with engine.connect() as con:
    con.execute('drop table user ')
    con.execute('create table user(id int,username varchar(10))')
    con.execute('drop table user ')
    #在windows下 库,表名 不区分大小写  linux下 严格区分大小写

三、flask-sqlalchemy Model

(1) 导入

from flask-sqlachemy import SQLAlchemy

(2) 配置URI地址

app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘mysql+pymysql://root:123456@127.0.0.1:3306/python1807’ #配置链接数据库的地址

四、model的字段 可选项

(1) 字段类型

类型名 python类型 说明
Integer int 整形 2(10)
SmallInteger int 小整形
BigerInteger int 长整形
Float float 浮点形
String string varchar类型 0-255
Text string text 类型 0-65535
Boolean bool True False
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间

(2) 约束条件

选项 说明
primary_key 主键索引
unique 唯一索引
index 常规索引
nullable 是否为空 默认True
default 默认值

五、创建模型

配置

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

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/python1807' #配置链接数据库的地址
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
manager = Manager(app)

实例 创建user模型

#创建模型
class User(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(20),index=True)
    sex = db.Column(db.Boolean,default=True)
    age = db.Column(db.Integer,default=20)

创建表

@app.route('/create_table/')
def create_table():
    db.create_all()
    return '创建表'

删除表

@app.route('/drop_table/')
def drop_table():
    db.drop_all()
    return '删除表'

注意:

创建表和删除表都是使用当前模型名创建模型的,表删除模型同名的所有的表

六、数据添加 修改 删除 查询的操作

(1) insert_one 添加一条数据

#添加一条数据
@app.route('/insert_one/')
def insert_one():
    u = User(username='张三',sex=False,age=18)
    db.session.add(u)
    db.session.commit()
    return 'insert_one'

(2) insert_many 添加多条数据

#添加多条数据
@app.route('/insert_many/')
def insert_many():
    try:
        u1 = User(username='李四')
        u2 = User(username='王五')
        db.session.add_all([u1,u2])
        db.session.commit()
    except:
        db.session.rollback()
    return 'insert_many'

(3) 数据的查询

@app.route('/select/')
def select():
    u = User.query.get(1)
    # print(u)
    print(u.username)
    print(u.sex)
    print(u.age)
    return '查询id值'

(4) 数据的修改

@app.route('/update/')
def update():
    u = User.query.get(1)
    u.username = '张三123'
    u.age = 30
    db.session.add(u)
    db.session.commit()
    return '修改'

(5) 数据的删除

#删除
@app.route('/delete/')
def delete():
    u = User.query.get(1)
    db.session.delete(u)
    db.session.commit()
    return '删除'

注意:

ORM开启了事物处理 在执行增 删 改 的时候 要提交或者 回滚

db.session.commit()

db.session.rollback()

七、拆分MVT

目录层级

project/
    App/
        templates/   模板 
            common/
                base.html
        static/        静态
            upload/
        models/        模型
            __init__.py
        views/        视图
            __init__.py
        forms/        表单
            __init__.py
        extensions.py    加载扩展库
        settings.py        配置文件
        email.py        邮件
        __init__.py        包的初始化

    migrations/ #迁移目录
    manage.py #启动

上一篇:
下一篇:
0%