sqlalchemy相关操作
sqlalchemy是一个Python ORM工具,类似与Java中的Mybatis、Hibernate等ORM框架,这里主要介绍sqlalchemy的一些常用操作。这里使用的数据库为postgresql,其它数据库类似。
安装sqlalchemy:
pip install sqlalchemy
创建三张表,一张学生表,一张班级表,一张成绩表:
DROP TABLE IF EXISTS "market_data"."students";
CREATE TABLE "market_data"."students" ("id" int4 NOT NULL,"name" varchar(25) COLLATE "pg_catalog"."default","sex" varchar(2) COLLATE "pg_catalog"."default","age" int4,"phone" varchar(20) COLLATE "pg_catalog"."default","class_id" int4
)
;
COMMENT ON COLUMN "market_data"."students"."name" IS '姓名';
COMMENT ON COLUMN "market_data"."students"."sex" IS '性别';
COMMENT ON COLUMN "market_data"."students"."age" IS '年龄';
COMMENT ON COLUMN "market_data"."students"."phone" IS '电话';
COMMENT ON COLUMN "market_data"."students"."class_id" IS '班级id';-- ----------------------------
-- Primary Key structure for table students
-- ----------------------------
ALTER TABLE "market_data"."students" ADD CONSTRAINT "students_pkey" PRIMARY KEY ("id");
DROP TABLE IF EXISTS "market_data"."class_room";
CREATE TABLE "market_data"."class_room" ("id" int4 NOT NULL,"class_name" varchar(10) COLLATE "pg_catalog"."default","address" varchar(10) COLLATE "pg_catalog"."default"
)
;
COMMENT ON COLUMN "market_data"."class_room"."class_name" IS '班级名';
COMMENT ON COLUMN "market_data"."class_room"."address" IS '班级位置';-- ----------------------------
-- Primary Key structure for table class_room
-- ----------------------------
ALTER TABLE "market_data"."class_room" ADD CONSTRAINT "class_room_pkey" PRIMARY KEY ("id");
DROP TABLE IF EXISTS "market_data"."grades";
CREATE TABLE "market_data"."grades" ("id" int4 NOT NULL,"student_id" int4,"subject" varchar(20) COLLATE "pg_catalog"."default","score" varchar(20) COLLATE "pg_catalog"."default"
)
;-- ----------------------------
-- Primary Key structure for table grades
-- ----------------------------
ALTER TABLE "market_data"."grades" ADD CONSTRAINT "grades_pkey" PRIMARY KEY ("id");
建立数据库映射,这里只展示students表的映射,其余类似:
import sqlalchemy as sqla
from sqlalchemy.ext.declarative import declarative_base as sqla_declarative_baseBaseModel = sqla_declarative_base()class Students(BaseModel):# 个股香草热点价格文件数据__tablename__ = 'students'id = sqla.Column('id', sqla.Integer, primary_key=True)name = sqla.Column('name', sqla.String)sex = sqla.Column('sex', sqla.String)age = sqla.Column('age', sqla.String)phone = sqla.Column('phone', sqla.String)class_id= sqla.Column('id', sqla.Integer)
以下操作将使用sqlalchemy数据库会话,统一使用db_session表示。
查询操作:
1、查询全部,查询全部学生信息all:
student_infos = db_session.query(Students).all()
2、单个条件查询,查询年龄为18的学生,使用filter:
student_infos = db_session.query(Students).filter(Students.age == 18
).all()
3、多个条件查询,查询年龄为48并且性别是男的学生,filter与and_:
from sqlalchemy import and_student_infos = db_session.query(Students).filter(and_(Students.age == 18,Students.sex == '男')
).all()
4、查询第一条数据first:
student_infos = db_session.query(Students).first()
5、只要一个结果时才正确返回one:
student_infos = db_session.query(Students).one()
6、查询指定列,查询全部学生的姓名、年龄:
student_infos = db_session.query(Students.name, Students.age).all()
7、查询性别为男并且年龄是18、19、20的学生,条件查询使用in:
student_infos = db_session.query(Students).filter(and_(Students.sex == '男',Students.age.in_(18, 19, 20))
).all()
8、查询结果排序order_by:
from sqlalchemy import desc, asc# 正序排列
student_infos = db_session.query(Students).order_by(asc(Students.age)).all()# 倒序排列
student_infos = db_session.query(Students).order_by(desc(Students.age)).all()# 多个条件排序
student_infos = db_session.query(Students).order_by(desc(Students.age), desc(Students.sex)).all()
9、对查询结果去重distinct:
from sqlalchemy import distinctstudent_infos = db_session.query(distinct(Students.sex)).all()
10、使用limit取前10个结果:
student_infos = db_session.query(Students).limit(10).all()
11、子查询subquery,查询成绩大于90以上的学生姓名:
# 子查询分两步,第一步进行正常操作的子查询,第二步是主查询subq = db_session.query(Grades.studentId).filter(Grades.score >= 90
).subquery()students = db_session.query(Students.name).filter(Students.id.in_(subq)
).all()
12、count计数查询:
from sqlalchemy import funcstudent_infos = db_session.query(func.count(Students.name)).all()
13、分组计数group_by:
from sqlalchemy import funcstudent_infos = db_session.query(Students.sex, func.count(Students.sex)).group_by(Students.sex).all()
14、查询结果取别名label:
students = db_session.query(Students.name.label.('user_name')).all()
15、模糊查询like:
students = db_session.query(Students.name.like('%小明%')).all()
16、or操作:
from sqlalchemy.sql import or_students = db_session.query(Students).filter(or_(Students.age == '18', Students.sex == '男')
).all()
17、between操作:
students = db_session.query(Students).filter(Students.age.between(16,20)
).all()
18、原生SQL查询text:
students = db_session.query(Students).filter(text('age =:age and sex =:sex')
).params(age=18, sex='男').all()
students = db_session.query(Students).from_statement(text("SELECT * FROM students WHERE age =:age")
).params(age=18).all()
19、表连接join,内连接直接使用JOIN,外连接使用outerjoin:
students = db_session.query(Students).join(ClassRoom).filter(ClassRoom.name = '一班'
).all()
students = db_session.query(Students).join(Grades, Students.id == Grades.student_id).filter(Students.sex == '男').all()
20、查询是否存在,exists:
from sqlalchemy import and_, exists# 存在返回True,不存在返回False
db_session.query(exists().where(and_(Students.name == '小明',Students.sex == '女')
).scalar)
删除操作:
1、删除姓名为小明的学生,delete:
db_session.query(Students).filter(Students.name == '小明'
).delete()
2、根据子查询条件删除,删除班级为"一班"的学生:
# 先子查询查出班级为一班的班级id
subq = db_session.query(ClassRoom.id).filter(ClassRoom.name == '一班'
).subquery()# 再根据子查询删除
db_session.query(Students).filter(Students.ClassId.in_(subq)
).delete(synchronize_session=False)
新增操作:
# 单个新增
db_session.add(Students)# 批量新增
db_session.add_all(Students_list)
修改操作:
db_session.query(Students).filter(Students.name == '小明'
).update({Students.name: '张三'})
sqlalchemy相关操作相关推荐
- 2021年大数据HBase(五):HBase的相关操作JavaAPI方式
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-JavaAPI方式 一.需求说明 ...
- 2021年大数据HBase(四):HBase的相关操作-客户端命令式!【建议收藏】
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-客户端命令式 1.进入HBase ...
- 2021年大数据Spark(二十五):SparkSQL的RDD、DF、DS相关操作
目录 RDD.DF.DS相关操作 SparkSQL初体验 SparkSession 应用入口 获取DataFrame/DataSet 使用样例类 指定类型+列名 自定义Schema ...
- 【数据结构】二叉树及其相关操作
二叉树的定义 二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成. 二叉树并非一般的树形结构的特殊形式,它们是两种不同的 ...
- Linux之用户组相关操作 groupadd groupdel
Linux之用户组相关操作 groupadd groupdel 1. 创建用户组 命令 说明 groupadd 创建(添加)用户组 创建用户组效果图: [grep是搜索功能,详情博文:https: ...
- Linux之用户相关操作
Linux之用户相关操作 1. 创建用户 [创建后会立即让设置密码] 命令 说明 useradd 创建(添加)用户 useradd命令选项: 选项 说明 -m 自动创建用户主目录,主目录的名字就是用 ...
- java导入包大全_eclipse快速导入jar包的相关操作步骤
eclipse怎样快速导入jar包呢?熟悉这款软件是非常简单的,今天小编就分享了关于eclipse快速导入jar包,有需要的朋友一起来看看吧! eclipse快速导入jar包的相关操作步骤 方法1·最 ...
- 顺序队列相关操作(C语言实现)
#顺序队列相关操作(C语言实现) #include<stdio.h> #define Size 100 typedef int DataType; typedef struct {Data ...
- oracle log.xml分析,怎么在alert目录下的log.xml中关闭logminer的相关操作日志? — oracle-tech...
Oracle版本10g-19c中,使用了logminer,但是在$ORACLE_SID/alert的目录下产生了大量的log_x.xml [email protected] alert]$ cd /o ...
最新文章
- 【ACM】POJ 3069
- 石墨计算机,高性能计算机助力石墨烯生产工艺的优化
- 学python就业要看哪些书-学习Python适合就业哪些岗位?老男孩Python学习
- 13.4 对锁和字段风格的事件的微小改变
- VS Code——Live Server的简介、安装与使用
- py获取前端的参数_微前端 qiankun 项目实践
- 深入理解RocketMQ中的NameServer
- 数据挖掘_wget整站下载
- 有了 Service Mesh,还需要 API 网关吗?
- 广数系统980tdb系统说明书_不同数控系统中各个倒角指令的用法
- 关于Acess 图片存为ole类型,数据集合显示
- 遇见C++ Lambda
- 基于ThinkPHP6 + Layui + MySql实现的企业OA系统
- BERT知识点汇总(en cour...)
- Jetson nano串口的使用——UART
- ORB-SLAM2的源码阅读(九):Initializer类
- 关于VB.net禁用右键菜单的实现
- The Shawshank Redemption-19
- 电信光猫百兆端口(iTv)联网设置
- 华硕m80微型计算机,小就不能满足你了?华硕M80迷你台式机评测
热门文章
- 【游戏设计2019.7.5】从DQB2开始谈起的游戏情感交互设计
- JavaScript:三元表达式详解
- 这样去面试,一定会像iphone8那样“崩盘”
- 如何在3D中创建一个复古游戏男孩:第1部分
- 计算机主机闪烁显示器黑屏,win7系统电脑显示器一闪一闪黑屏的故障原因及解决方法...
- 阅读方法论看书的乐趣
- java 按符号分割字符串_如何根据java根据指定的字符,分割字符串?
- HTML5 和 CSS3 提高
- 使用Acctinfo.dll了解更多AD用户帐号信息
- SQL基础教程MICK版 ···第五章总结