flask-sqlalchemy库

彩笔激流勇退。

1. 简介

ORM,对象关系映射。简单来说,ORM将数据库中的表与面向对象中的类建立了一种对应关系。这样,我们要操作数据库,表,记录就可以直接通过操作类或者类实例来完成。

SQLAlchemy 是目前python中最垃圾的 ORM框架, 功能全面, 使用复杂。

Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展,把原本pymysql几句话就能搞定的事情整成抽象的,继承的,封装的,多态的更适合高级程序员体质的负离子保温杯。

抛开兼容性不谈,Flask-SQLAlchemy无疑是磨练程序员改bug的磨刀石,是检验程序员记忆能力的试金石,是凝结了人类精华的草酸钙结石。

常用字段类型

类型名python接收类型mysql生成类型说明
Integerintint整型
Floatfloatfloat浮点型
Numeric(5,2)decimal.Decimaldecimal(5,2)
Booleanbooltinyint整型,只占1个字节
Textstrtext文本类型,最大64KB
LongTextstrlongtext文本类型,最大4GB
Stringstrvarchar变长字符串,必须限定长度
Datedatetime.datedate日期
DateTimedatetime.datetimedatetime日期和时间
Timedatetime.timetime时间
TIMESTAMPdatetime.datetimeTIMESTAMP时间戳,可以用text(‘now()’)赋值

常用的字段选项

选项名说明
primary_keyTrue,则该字段为表的主键,默认自增
uniqueTrue,则这列设置唯一
nullableFalse,则这列设置非空
default为这列设置默认值,不作用在数据库
server_default值必须是字符串格式,作用在数据库
indexTrue,则为这列创建索引,提高查询效率

如果没有给对应字段的类属性设置default参数, 且添加数据时也没有给该字段赋值, 则sqlalchemy会给该字段设置默认值 None。

常见命令

db.create_all() #创建所有表
db.drop_all() #删除所有表
2. 创建表

pip install pymysql

pip install flask-sqlalchemy

数据库URL(连接地址)格式: 协议名://用户名:密码@数据库IP:端口号/数据库名

main.py

​ 在下面代码中,我们使用了 with app.app_context(): 语句来确保当前应用实例的操作db.create_all() 是在flask应用上下文中被调用的。

from app import *
from models import User@app.route('/',methods=['GET','POST'])
def login():print(db)return 'hello world'if __name__ == '__main__':with app.app_context():db.create_all()#创建表app.run(host='0.0.0.0',port=9901,debug=1)

modules.py

表名默认为类名小写, 可以通过 __tablename__类属性 进行修改

from app import dbclass User(db.Model):# User表__tablename__ = 't_user'id= db.Column(db.Integer,primary_key=True) # 必须要有主键存在name=db.Column(db.String(20),nullable=True)# 可空age=db.Column(db.SmallInteger)gender=db.Column(db.Boolean)birthday=db.Column(db.Date)

对应MySQL语句

CREATE TABLE `t_user` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,`age` smallint DEFAULT NULL,`gender` tinyint(1) DEFAULT NULL,`birthday` date DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

app.py

from flask import Flask,url_for,request,render_template,make_response,redirect,jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) # 用本脚本名实例化Flask对象
# 设置数据库连接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/test1'# 是否追踪数据库修改(开启后会触发一些钩子函数)  一般不开启, 会影响性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 是否显示底层执行的SQL语句
app.config['SQLALCHEMY_ECHO'] = True# 初始化组件对象, 直接关联Flask应用
db = SQLAlchemy(app)
3. 数据表简单查询

在这里插入图片描述

user=User.query

说明
user.filter_by(id=1)只能等值查询,使用=
user.filter(User.id==1)条件查询,用==
use.filter 参数与运算符说明
and_(User.id==1,User.age==99)
or_(User.id==1,User.age==99)
~(User.id==1)
!= None>>=
User.name.like('%a%')模糊查询
User.id.in_((1,2,5))范围查询
User.id.between(1,3)[1,3]
if __name__ == '__main__':with app.app_context():db.create_all()user=User.queryprint(user)#显示sql语句, 返回Query对象print(user.all())#[<User 1>, <User 2>, <User 3>],每个元素都是models.User类型print(user.count()) #返回query中的Model对象数量print(user.filter_by(age=30,id=1)) #显示SQL语句, 返回Query对象,内部条件为交集
4. 映射查询 db.session.query

映射查询在SQLAlchemy中,可以通过session对象的query方法完成。

注意关键字书写顺序

db.session.query().filter().group_by().having().order_by().paginate().all()
if __name__ == '__main__':with app.app_context():db.create_all()query=db.session.query(User) #<class 'flask_sqlalchemy.query.Query'>print(query.filter(User.id>1).all())# [<User 2>, <User 3>]query2=db.session.query(User.id,User.name)print(query2.filter(User.age==99).all())# [(2, 'tom')]app.run(host='0.0.0.0',port=9901,debug=1)
5. 排序 order_by

from sqlalchemy import desc

if __name__ == '__main__':with app.app_context():db.create_all()query = db.session.query(User.id, User.name,User.age)print(query.order_by(User.age).all())  # 默认升序排序,asc()print(query.order_by(desc(User.age)).all())  # 降序排序print(query.order_by(User.age,User.id).all())  # 先排age,后排idapp.run(host='0.0.0.0', port=9901, debug=1)# 看起来是一个阻塞函数
6. 聚合函数

数据库先添加一个age为30的记录。

from sqlalchemy import func

聚合函数说明
count()记录数量
sum()加和总值
avg()平均值
max()最大值
min()最小值
if __name__ == '__main__':with app.app_context():db.create_all()query = db.session.query(func.max(User.age),func.avg(User.age))#相当于 SELECT max(age) , avg(age) FROM t_userprint(query.all())  # [(99, Decimal('51.0000'))]app.run(host='0.0.0.0', port=9901, debug=1)
7. 分组查询 group_by
if __name__ == '__main__':with app.app_context():db.create_all()query = db.session.query(func.count(User.id))print(query.group_by(User.age).all())  # [(2,), (1,), (1,)]app.run(host='0.0.0.0', port=9901, debug=1)
8. 增删改

flask开了debug模式,删除数据会导致main函数重新执行,给爷整笑了。

if __name__ == '__main__':with app.app_context():db.create_all()#更新u = db.session.query(User.id==1)# 查询主键为1的记录u.name="Jack"#db.session.rollback() 事务回滚,默认遇到错误自动回滚db.session.commit()# 事务提交#删除u2=db.session.query(User).filter(User.id==6).all() # User 模型的实例if len(u2)!=0:db.session.delete(u2[0])db.session.commit()  # 事务提交#增加u3=User(id=7,name="lihua",age=35,gender=1,birthday='2077-1-1')db.session.add(u3)#db.session.add_all([u1,u2,u3]) 一次添加多个db.session.commit()app.run(host='0.0.0.0', port=9901, debug=0)# debug=1时,上面的delete操作会执行多次# 大概是是检测到了文件变化重启了一次main函数???
9. 分页查询 paginate

分页查询不老老实实用limit,非要整个paginate装什么高大上。

if __name__ == '__main__':with app.app_context():db.create_all()pg=db.session.query(User).paginate(page=2,per_page=2)# QueryPagination objectprint(pg.items)#[<User 3>, <User 4>],当前页数据print(pg.pages) #3 ,一共三页for i in pg.iter_pages(): #迭代Pagination.iter_pages对象print(i)#1 2 3app.run(host='0.0.0.0', port=9901, debug=0)
10. 原生sql支持
if __name__ == '__main__':with app.app_context():db.create_all()statement=text('select * from t_user where id> :id').params(id=1)query=db.session.query(User).from_statement(statement)print(query.all())# [<User 2>, <User 3>, <User 4>, <User 7>]#最傻逼的地方来了,新版本下面语句不支持# statement2 = text('select max(id) as mmid,max(age) as mage from t_user where id> :id').params(id=2)# query2 = db.session.query('mmid','mage').from_statement(statement2)# sqlalchemy.exc.ArgumentError# 感觉不如直接pymysqlsql=text('select max(id) as mmid,max(age) as mage from t_user where id> :id')result=db.session.execute(sql,{'id':2})# CursorResult object#print(result.fetchall())# [(7, 45)] 如果这里获取了,下面就获取不了,有点类似游标后移导致没数据读for i in result:print(i)# (7, 45)app.run(host='0.0.0.0', port=9901, debug=0)

参考

flask框架与mysql开发入门到实践 白菜爱科技

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/525974.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序网页view多行文本超出隐藏或显示省略号

实现效果&#xff1a; 限制两行&#xff0c;超出即显示省略号 实现&#xff1a;话不多说&#xff0c;展示代码 关键代码 .box{ width:100rpx; overflow:hidden; text-overflow: ellipsis;//超出省略号 display:-webkit-box; -webkit-line-clamp: 2;//显…

leetcode 热题 100_相交链表

题解一&#xff1a; 哈希表&#xff1a;两链表出现的第一个相同的值就是相交节点&#xff0c;因此我们先用哈希记录链表A所有出现过的值&#xff0c;再遍历链表B查找哈希表&#xff0c;找出第一个相同的值即为结果。 import java.util.HashSet;public class Solution {public …

Feign实现微服务间远程调用续;基于Redis实现消息队列用于延迟任务的处理,Redis分布式锁的实现;(黑马头条Day05)

目录 延迟任务和定时任务 使用Redis设计延迟队列原理 点评项目中选用list和zset两种数据结构进行实现 如何缓解Redis内存的压力同时保证Redis中任务能够被正确消费不丢失 系统流程设计 使用Feign实现微服务间的任务消费以及文章自动审核 系统微服务功能介绍 提交文章-&g…

zookeeper Study

zk介绍&#xff1b;一种分布式协调服务。 分布式锁&#xff0c;集群选举&#xff0c;数据同步 。 zk都能进行操作&#xff0c;redis&#xff0c;kafka&#xff0c;rabbitmq&#xff0c;都能够用zk做协调管理服务。关键时zk简单操作。 应用说明&#xff1a; 简单介绍一下流程 &…

Python 3 教程(2)

Python3 基础语法 编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*- 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&…

02-gitlab的数据备份和恢复

一、gitlab的数据备份 关于数据备份&#xff0c;咱们就不需要多说什么了&#xff0c;主要就是方式数据意外丢失&#xff0c;导致代码上线流程及数据的损坏崩溃&#xff1b; 为了避免严重生产事故&#xff0c;进而gitlab有了数据备份与恢复的功能。 1&#xff0c;修改gitlab的配…

悬浮工具球(仿 iphone 辅助触控)

悬浮工具球&#xff08;仿 iphone 辅助触控&#xff09; 兼容移动端 touch 事件点击元素以外位置收起解决鼠标抬起触发元素的点击事件问题 Demo Github <template><divref"FloatingBal"class"floating_ball":class"[dragging, isClick]&q…

C语言中的UTF-8编码转换处理

C语言UTF-8编码的转换 1.C语言简介2.什么是UTF-8编码&#xff1f;2.1 UTF-8编码特点&#xff1a; 3.C语言中的UTF-8编码转换处理步骤1&#xff1a;获取UTF-8编码的字节流步骤2&#xff1a;解析UTF-8编码步骤3&#xff1a;Unicode码点转换为汉字 4.总结 1.C语言简介 C语言是一门…

【Unity InputSystem】实用指南:在PC端(鼠标与键盘)、手机端(触摸屏)、主机手柄上同步实现角色移动与跳跃功能

前引 随着Unity的不断发展&#xff0c;开发者对于项目的输入系统要求也日益提高。在进行多平台适配和跨平台移植时&#xff0c;常常需要改变输入系统&#xff0c;这给开发者带来了不少困扰。而Unity官方推出的InputSystem插件&#xff0c;则是为了解决这一问题而推出的全新输入…

ChatGPT 控制机器人的基本框架

过去的一年&#xff0c;OpenAI的chatGPT将自然语言的大型语言模型&#xff08;LLM&#xff09;推向了公众的视野&#xff0c;人工智能AI如一夜春风吹遍了巴黎&#xff0c;全世界都为AI而疯狂。 OpenAI ChatGPT是一个使用人类反馈进行微调的预训练生成文本模型。不像以前的模型主…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、 省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

Pb量级超大容量光存储

近日&#xff0c;中国科学院上海光学精密机械研究所&#xff08;以下简称“上海光机所”&#xff09;与上海理工大学等科研单位合作&#xff0c;在超大容量三维超分辨光存储研究中取得突破性进展。研究团队利用国际首创的双光束调控聚集诱导发光超分辨光存储技术&#xff0c;实…