一、Model
flask作为一款MVT的框架,也具有ORM模型的操作,通过扩展库(flask-sqlalchemy)来实现。
随着项目越来越大,采用原生sql的话,就会出现大量的原生sql语句。
ORM模型的好处:
- SQL语句重复使用率低,越复杂的sql语句,语句就越长,会出现很多相似的sql语句
- 很多sql语句都是根据业务逻辑拼接出来的,如果数据库发生了修改,那么这些逻辑就需要重写 这样就会漏掉某些sql的更改
- 原生SQL容易漏掉,对sql语句安全性的考虑
工作原理:
ORM 是对象关系的映射,我们可以通过类的方式去操作数据库,不再使用原生的SQL语句了。ORM中的类映射数据库中的每个表,类中的每个属性映射成表中的每个字段。ORM最终还是会将开发者操作的增删改查的代码转换成sql语句,再去操作数据库。
好处:
- 可以使用简短的代码写出比较复杂的SQL语句
- 可以减少重复sql语句的概率
- 可移植性好,只需要更改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)