以下所有代码片段都使用了统一的引用,该引用如下:

from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer, Table
from sqlalchemy.orm import relationship, sessionmaker

一、表结构设计

engine = create_engine("mysql+pymysql://root:root@localhost/study?charset=utf8", echo=True)  # 连接数据库,显示SQL语句

Base = declarative_base()  # 创建基类

class Student(Base):
__tablename__ = 'students' # 指定表名
__table_args__ = {
# "mysql_engine":"MyISAM",
"mysql_charset":"utf8"
}
# show create table students 可以查看建表语句;默认是Innodb,lating-1.如果想显示中文需要修改指定建表的类型,同时,engine也要指定编码格式
id = Column(Integer, primary_key=True) #指定主键
name = Column(String(30)) #多个字段名
gender = Column(Integer)
std_id = Column(String(10))
teacher = Column(String(30)) def __str__(self): #显示对象的时候打印名字
return self.name Base.metadata.create_all(engine) # 创建所有继承自 Base 的类对应的表

sqlslchemy在数据库中创建表之前,会先检查该表是否存在,如果不存在,才会去创建新表。

class Student(Base):
__tablename__ = 'students' # 指定表名
id = Column(Integer, primary_key=True)
name = Column(String(30))
gender = Column(Integer)
std_id = Column(String(10))
teacher = Column(String(30))
**math = Column(Integer)** #变量字段 def __str__(self):
return self.name

虽然新加了一个math 变量(字段),但是由于数据库中已有students表,所以不会去创建新表,match字段也就不存在。

二、基本增删改查

1.插入数据

Session = sessionmaker(bind=engine)  # 获取 Session类
ses = Session() # 获取session对象 zhangsan = Student(name="zhangsan", gender=1, std_id='XS331', teacher='hanmeimei', math=90)
lisi = Student(name="lisi", gender=1, std_id='XS332', teacher='hanmeimei', math=10)
wangwu = Student(name="wangwu", gender=0, std_id='XS333', teacher='lilei', math=60)
zhaoliu = Student(name="zhaoliu", gender=0, std_id='XS337', teacher='lilei', math=80)
ses.add(zhangsan) # 单条添加
ses.add_all([lisi, wangwu, zhaoliu]) # 批量添加
ses.commit()

2.修改数据

zhangsan = ses.query(Student).filter_by(name='zhangsan').first()  #先获取对象
zhangsan.math = 91 #更改对象的属性
ses.commit() #提交

也可以在还创建数据的时候修改,就是在提交之前进行修改:

liqi = Student(name="liqi", gender=1, std_id='XS335', teacher='xiadonghai', math=100)   #实例化一个对象
ses.add(liqi) #添加对象,也可以视作添加一条数据
liqi = ses.query(Student).filter_by(name='liqi').first()
liqi.gender = 0
ses.commit()

在创建一个对象之后,未添加之前直接改变其属性。

liqi = Student(name="liqi", gender=1, std_id='XS335', teacher='xiadonghai', math=100)
liqi.gender = 0
ses.add(liqi)
ses.commit()

除此之外还可以使用update。

sess.query(Student).filter_by(name='liming').update({'gender':0})
sess.commit()

3.删除

result = sess.query(Student).filter(Student.id == 1 ).delete()
sess.commit()
result = sess.query(Student).filter(Student.id == 2 ).first()
sess.delete(result)
sess.commit()

4.查询

查询操作在数据库操作中总是最复杂的,下面介绍一些常用的操作。

(1)算术操作符

= 操作符
students_99 = sess.query(Student).filter_by(name ='zhangsan').all()
students_100 = sess.query(Student).filter(Student.name == 'zhangsan').all()
for i in students_100:
print(i.name)
!= 操作符
student_101 = sess.query(Student).filter_by(name != 'liming').all() # error
student_98 = sess.query(Student).filter(Student.name != 'liming').all()
for i in student_98:
print(i.name)
> ,<, <=, >=, 操作符
student_60 = sess.query(Student).filter(Student.math > 10).all()
student_61= sess.query(Student).filter_by(math>10).all() # error
student_62 = sess.query(Student).filter(Student.math < 100).all()
student_63 = sess.query(Student).filter(Student.math <= 90).all()
student_64 = sess.query(Student).filter(Student.math >= 90).all()
student_64 = sess.query(Student).filter(Student.math <> 90).all() # error
for i in student_60:
print(i.math)
for i in student_62:
print(i.math)
for i in student_63:
print(i.math)
for i in student_64:
print(i.math)

(2)模糊查询

like 操作符  % 代表任意多个字符  _ 代表一个字符
student_17 = sess.query(Student).filter(Student.name.like("%i%")).all()
for i in student_17:
print(i.name)
student_17_2 = sess.query(Student).filter(Student.name.like("%i_i")).all()
for i in student_17_2:
print(i.name) not like
student_70 = sess.query(Student).filter(~Student.name.like("%i_i")).all()
student_71 = sess.query(Student).filter(Student.name.notlike("%i_i")).all()
for i in student_70:
print(i.name)
print(student_70 == student_71)

(3)区间选取

in 操作符
student_18 = sess.query(Student).filter(Student.name.in_(['zhangsan','lisi','wangwu'])).all()
for i in student_18:
print(i.name)
not in
student_19 = sess.query(Student).filter(~Student.name.in_(['lisi'])).all()
student_19_2 = sess.query(Student).filter(Student.name.notin_(['lisi'])).all()
for i in student_19:
print(i.name)
print(student_19 == student_19_2)

(4)分页

student_10 = sess.query(Student).limit(2).offset(1).all()  #从第几条开始选取几条
student_11 = sess.query(Student).offset(1).limit(2).all()
student_12 = sess.query(Student)[1:3]
for i in student_10:
print(i.id)
for i in student_11:
print(i.id)
for i in student_12:
print(i.id)

(5)排序

order_by 排序
student_33 = sess.query(Student).filter(text("math >= 10")).order_by(~text("math")).all() # 逆序
student_33_2 = sess.query(Student).filter(text("math >= 10")).order_by(text("math")).all() # 顺序
student_33_2_1 = sess.query(Student).filter(text("math >= 10")).order_by(desc(text("math"))).all() # 逆序
student_33_3 = sess.query(Student).order_by(desc(Student.math)).all() # 逆序
student_33_4 = sess.query(Student).order_by(Student.math.desc()).all() # 逆序
student_33_5 = sess.query(Student).order_by(~Student.math).all() # 逆序
student_33_6 = sess.query(Student).order_by(Student.math).all() # 顺序
print(student_31)
print(student_32)
print("___"* 30)
for i in student_33:
print(i.math)
print("___"* 30)
for i in student_33_2:
print(i.math)
for i in student_33_3:
print(i.math)
for i in student_33_4:
print(i.math)
for i in student_33_5:
print(i.math)
for i in student_33_6:
print(i.math)

(6)分组

group_by 分组
student_39 = sess.query(Student).group_by(Student.gender == 1).count()
print(student_39)

(7)having:分组之后条件过滤

having
student_39_1 = sess.query(Student).group_by(Student.gender == 1).having(Student.math>60).all()
for i in student_39_1:
print(i)

(8)计数

count
student_38 = sess.query(Student).filter_by(gender=1).count()
student_38_2 = sess.query(func.count(Student.name),Student.name).group_by(Student.name).all()
student_38_3 = sess.query(func.count(Student.name),Student.gender).group_by(Student.gender).all()
print(student_38_2)
print(student_38_3)

(9)去重

distinct
student_40 = sess.query(distinct(Student.name)).all()
for i in student_40:
print(i)

(10)空值

是否为null
student_20 = sess.query(Student).filter(Student.name != None).all()
student_21 = sess.query(Student).filter(~Student.name.is_(None)).all()
student_22 = sess.query(Student).filter(Student.name.isnot(None)).all()
student_21_3 = sess.query(Student).filter(Student.name.is_('zhangsan')).all() # error
student_21_2 = sess.query(Student).filter(Student.name.is_(1)).all()
for i in student_20:
print(i.name)
print(student_20 == student_21 == student_22) student_23 = sess.query(Student).filter(Student.math.is_(90)).all()
student_24 = sess.query(Student).filter(Student.math == None).all()

(11)逻辑操作

and
student_25 = sess.query(Student).filter(Student.gender == 1, Student.math > 70).all()
student_26 = sess.query(Student).filter(and_(Student.gender == 1, Student.math > 70)).all() # 别忘了引入该方法
student_27 = sess.query(Student).filter(Student.gender == 1).filter(Student.math > 70).all()
for i in student_25:
print(i.name)
print(student_25 == student_26 == student_27) or
student_28 = sess.query(Student).filter(or_(Student.gender == 1, Student.math > 80)).all()
for i in student_28:
print(i.name)

(12)text:原生sql语句

text  原生sql条件语句
student_31 = sess.query(Student).filter(text("name='lisi'")).first() # 注意值为字符串时的写法
student_32 = sess.query(Student).filter(text("id=1")).first() # 注意值为 数字 的写法
student_31 = sess.query(Student).filter(text("id>1 and math>10")).all()
for i in student_31:
print(i.name) text 插入变量
student_34 =sess.query(Student).filter(text("gender=:sex and math>:score")).params(sex=1, score=1).all()
for i in student_34:
print(i.name) from_statement 原生sql语句
student_35 = sess.query(Student).from_statement(text("select * from students where id=:id")).params(id=1).one()
student_36 = sess.query(Student).from_statement("select * from students where math>:score").params(score=10).all()
student_36_1 = sess.query(Student).from_statement("select * from students where math>10").all()
print(student_35)
for i in student_36:
print(i.name)
print(student_36 == student_36_1)

(13)使用别名

student_7 = sess.query(Student.name.label('std_name')).all()
print(student_7)
for i in student_7:
print(i.std_name)
print(i[0]) # 第二种取值方式
student_8 = sess.query(Student.name).all()
print(student_8)
for i in student_8:
print(i.name)
print(i[0])

(14)取值

根据主键获取对象
students_1 = sess.query(Student).get(1)
print(students_1 value指定要获取的字段 返回的是生成器
students_3 = sess.query(Student).value(Student.name)
print(students_3) values 指定多个字段 返回的是生成器
students_3_2 = sess.query(Student).values(Student.id,Student.name)
print(students_3_2)
for i in students_3_2:
print(i) 一次获取多个字段值
students_4 = sess.query(Student.name,Student.gender).all()
print(students_4)
for i in students_4:
print(i) 后续添加的方式选择要得到的字段结果
students_5 = sess.query(Student.name).add_columns(Student.gender).all()
print(students_5)
student_6 = sess.query(Student).filter_by(name="王大麻子").one()
print(student_6) 错误用法
error_1 = sess.query(Student).filter_by(and_(Student.id == 1, Student.name == 'lisi')).first()
error_2 = sess.query(Student).filter_by(and_(id=1, name='lisi')).first()
error_3 = sess.query(Student).filter(and_(id=1, name='lisi')).first() one 有且只有一个,否则报错
student_30 = sess.query(Student).filter(Student.id == 1).one()
print(student_30)
可以只有一个或者没有,不能为多个结果,否则报错
student_31 = sess.query(Student).filter(Student.id == 10).one_or_none()
print(student_31) student_13 = sess.query(Student).filter_by(id=1).one_or_none()
student_14 = sess.query(Student).filter(Student.id == 1).one_or_none()
print(student_13)
print(student_14)

(15)chain链式调用

student_15 = sess.query(Student).filter_by(gender=1).filter(Student.math>80).all()
# student_15_2 = sess.query(Student).filter_by(gender=1).filter_by(math>80).all() # error
student_16 = sess.query(Student).filter(Student.gender == 1).filter(Student.math>80).all()
for i in student_15:
print(i.name)
for i in student_16:
print(i.name)
												

sqlalchemy——基本操作的更多相关文章

  1. Python SQLAlchemy基本操作和常用技巧包含大量实例,非常好python

    http://www.makaidong.com/%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6/28053.shtml "Python SQLAlchemy基本操 ...

  2. SQLAlchemy基本操作和常用技巧

    点击打开链接 Python的ORM框架SQLAlchemy基本操作和常用技巧,包含大量实例,非常好的一个学习SQLAlchemy的教程,需要的朋友可以参考下 python编程语言下的一款开源软件.提供 ...

  3. 【Python】Python SQLAlchemy基本操作和常用技巧

    首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 MySQL InnoDB 使用,所以使用其他数据库的也不能完全照搬本文. 接着就从安装 ...

  4. Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

    https://www.jb51.net/article/49789.htm 首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 MySQ ...

  5. Python SQLAlchemy基本操作和常用技巧

    转自:https://www.jb51.net/article/49789.htm 首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 M ...

  6. sqlalchemy 基本操作

    表操作 models.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ...

  7. Python SqlAlchemy使用方法

    1.初始化连接 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create ...

  8. python数据库操作之pymysql模块和sqlalchemy模块(项目必备)

    pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 1.下载安装 pip3 install pymysql 2.操作数据库 (1).执行sql #! ...

  9. sqlalchemy外键和relationship查询

    前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循 ...

随机推荐

  1. hdu 5365 Run(BC 50 B题)(求四边形的个数)

    本来准备睡觉.结果还是忍不住想把它A了.由于已经看了题解了, 题意:就是给你一些坐标.都是整数,求一些正多边形的数目,官方题讲解是地球人都知道整数坐标构不成正三角形.正五边形和正六边形的... 然而我 ...

  2. 【BIEE】分析的解析机制

    今天使用BIEE时意外的发现个问题,BIEE在展示结果时候,是先进行排序,然后再展示.具体测试案例如下: 首先,存在如下数据: 在BIEE展示效果如下: 目前是根据O1,02,03,04,05,06, ...

  3. php调用python

    test_python.php <?php $k = $_REQUEST['k']; if (!empty($k)) { $k = trim($k); //$a 用来捕获输出 // 这里的arr ...

  4. struct和class的不同以及struct的应用场景

    struct在C#中被用来定义结构,它是一种比类小的数据类型.和类一样都是创建对象的模板,可以有自己的数据以及处理和访问数据的方法. struct的用法: struct FurnitureSize { ...

  5. C#中后台线程和UI线程的交互

    在C#中,从Main()方法开始一个默认的线程,一般称之为主线程,如果在这个进行一些非常耗CPU的计算,那么UI界面就会被挂起而处于假死状态,也就是说无法和用户进行交互了,特别是要用类似进度条来实时显 ...

  6. 转: Genymotion使用及离线镜像的安装

    Genymotion是一套完整的工具,它提供了Android虚拟环境.由于它比Android自带的模拟器要流畅好多,所以它简直就是开发者.测试人员.推销者甚至是游戏玩家的福音.支持Windows.Li ...

  7. Theme.AppCompat.Light无法找到问题

    使用adt开发新建一个Android app.选择支持的SDK版本号假设小于11(Android3.0)就会报例如以下错误. error: Error retrieving parent for it ...

  8. 运用Arc Hydro提取河网

    Arc hydro 插件需要 spatial analyst 支持: 解决方法:Tools菜单>>Extensions...,勾选Spatial Analyst 1.设置存储路径 ApUt ...

  9. 在ubuntu1604上使用aria2下载coco数据集效率非常高

    简单的下载方法: 所以这里介绍一种能照顾大多数不能上外网的同学的一种简单便捷,又不会中断的下载方法:系统环境: Ubuntu 14.04 方法: a. 使用aria2 搭配命令行下载.需要先安装: s ...

  10. 启动spring boot 异常

    再我搭建spring boot工程后,run application的时候抛出下面异常 Exception /slf4j-log4j12-.jar). If you are using WebLogi ...