[TOC]
Flask 模型: Flask 默认并没有提供任何数据库操作的API,我们可以选择任何合适自己项目的数据库来使用,可以采用原生的语句实现也可以采用ORM框架(SQLAlchemy / MongoEngine 扩展库) 实现;
Q: 原始SQL有何缺点?
答: 代码利用率低且条件复杂代码语句越长,有狠毒相似语句一些SQL是在业务逻辑中拼出来的修改需要了解业务逻辑,并且可能会导致一些SQL安全问题, 优点是性能好速度快;
Q: 使用ORM对象优点?
答: 实际上将对象的操作转换为原生的SQL,我们并不需要关注我们使用的是什么数据库只需要设计出模型Model即可;
- 1.易用性可以有效减少重复SQL
- 2.性能损耗少
- 3.设计灵活,可以轻松的实现复杂查询
- 4.移植性好
SQLAlchemy 连接流程:
- 1.指定数据库配置
app.config['SQLALCHEMY_DATABASE_URI']=DB_URI
以及禁止对象追踪修改app.config['SQLALCHEMY_TRAKE_MODIFICATIONS']=False
- 2.通过懒加载的方式初始化SQLalchemy()扩展;
- 3.数据库的使用创建模型class Person(db.model)
- 4.数据库操作
创建数据库: db.create_all()
删除数据库:db.drop_all()
数据更新插入: db.session.add(Object) / db.session.add_all(List)
数据删除: db.session.delete(Object)
数据提交: db.session.commit()
- 5.数据库查询:
# 查询数据结果集
# 模型类.query.查询方法
Student.query.frist()
Student.query.get(主键ID) # 返回Student对象主键数据否则None
Student.query.get_or_404(主键索引) # 找寻到返回数据否则返回404
Student.query.all() # 查询所有
# 蓝图属性
#模板/静态路径默认在Flask(app)创建的路径下,或者采用以下方式自定义模板路径
template_folder = "../templates" # Flask 创建或者在蓝图创建时指定
static_folder = "../static"
#蓝图统一前缀必须以/打头
url_prefix='/db'
#模板中也能使用反向解析(与Python代码一致)
def redirect():
return url_for('blue.get_student',id=1) # blue.get_student 是端点名称
静态资源软编码在Flask中默认支持的,
默认路径在和Flask同级别的static中
静态资源是有路由的endpoint是static参数有一个filename
<link rel="stylesheet" href="{{ url_for('static',filename='css/index.css') }}"/>
Flask开发帮助工具插件Flask-Debugtoolbar,它是从Django中借鉴的样式基本一致;
pip install Flask-Debugtoolbar
DebugToolbarExtension(app) # 在ext.py中进行初始化
关系型数据库最多使用的三种数据库类型: 数字 INT、字符串 CHAR、时间日期 DATETIME
SQLAlchemy 字段类型:
代码语言:javascript复制Numeric
# 1.实际上都是整型的只是继承后然后改改名称不同而已;
Integer
SmallInteger
BigInteger
#2.浮点型
Float
Real
# 3.字符串(文本)类型
String
# 4.经Unicode编码后的类型
Unicode
Unicode Text
# 5.布尔值关系型数据库一般不支持用0、1代替
Boolean
Date
Time
Datetime
Interval
LargerBinary
代码语言:javascript复制sqlite> .schema user
CREATE TABLE user(
uid INT PRIMARY KEY NOT NULL,
name VARCHAR(32) NOT NULL,
gender INT2 NOT NULL,
yearsofwork INT,
address VARCHAR(255)
);
class User(db.Model):
uid = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
gender = db.Column(db,Integer)
worktime = db.Column
sqlite> .schema recordtype
CREATE TABLE recordtype (
rid INT PRIMARY KEY NOT NULL,
name TEXT NOT NULL
);
sqlite> .schema record
CREATE TABLE record(
rid INT PRIMARY KEY NOT NULL,
uid INT NOT NULL,
starttime TIMESTAMP NOT NULL,
endtime TIMESTAMP NOT NULL,
applytime TIMESTAMP NOT NULL,
context CHAR(255) NOT NULL,
daytype CHAR(32) NOT NULL,
recordtime TIMESTAMP NOT NULL
);