一、ORM 与 SQLAlchemy 简介

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

SQLAlchemy 是Python 社区最知名的 ORM 工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。

安装 SQLAlchemy:

pip3 install sqlalchemy

二、创建数据表和数据库连接

create_table.py

#导入
from sqlalchemy import Column,Integer, String, create_engine
from sqlalchemy.orm import sessionmaker #创建操纵数据库的会话窗口
from sqlalchemy.ext.declarative import declarative_bas #创建对象的基类
Base = declarative_base() # 定义User类:
class User(Base):
# 表的名字:
__tablename__ = 'user' # 表的结构:
id = Column(Integer, primary_key=True)
name = Column(String(32),index=True) #初始化数据库连接:
engine = create_engine("mysql+pymysql://root:口令@127.0.0.1:3306/数据库名?charset=utf8") #创建会话对象
Session = sessionmaker(engine)#自动检索所有继承Base的ORM 对象 并且创建所有的数据表
Base.metadata.create_all(engine)

三、单表的增删改查操作

增加数据

#mysql操作
insert into user(name) values ("fengchong") #sqlalchemy操作
#1.导入数据库连接,表,会话对象
from create_table import engine,User,Session #2.打开会话对象
db_session = Session() #3.添加一条数据
db_session.add( User(name="fengchong") )
#执行会话窗口中的所有操作
db_session.commit() #4.添加多条数据
db_session.add_all(
[
User(name="zhaomingyang"),
User(name="haha"),
User(name="xiaoxiao")
]
)
db_session.commit() #5.关闭会话对象
db_session.close()

crud_insert

查询数据

#mysql操作:
select * from user where 条件 #sqlalchemy操作:
#1.导入
from create_table import User,engine,Session #2.打开会话对象
db_session = Session() #3.简单查询
user_list = db_session.query(User).all()
for user in user_list:
print(user.id,user.name)
user = db_session.query(User).first() #4.带条件的查询
user_list = db_session.query(User).filter(User.id == 3).all() #取出符合条件的全部结果,结果为一个列表,里面存的是一个个的对象
print(user_list) user = db_session.query(User).filter_by(id=4).first()
print(user) #取出符合条件的第一个,user为符合条件的对象 user_list = db_session.query(User).filter(User.id >= 2).all()
print(user_list)

crud_query

修改数据

mysql操作:
UPDATE user SET name="fengchong123" WHERE name=fengchong sqlalchemy操作:
#1.导入
from create_table import User,engine,Session #2.打开会话对象
db_session = Session() #3.先查询在修改
res = db_session.query(User).filter(User.name == "fengchong").update({"name":"fengchong123"}) #4.提交
db_session.commit() #5.关闭会话
db_session.close()

crud_update

删除数据

#mysql操作:
delete from user where id=5 #sqlalchemy操作:
#1.导入
from create_table import User,engine,Session #2.打开会话对象
db_session = Session() #3.先查询再删除
res = db_session.query(User).filter(User.id==5).delete() #4.提交
db_session.commit() #5.关闭会话
db_session.close()

crud_delete

高级版查询操作

# 查询数据表操作
# and or
from sqlalchemy.sql import and_ , or_
ret = db_session.query(User).filter(and_(User.id == 3, User.name == 'fengchong')).all() #and
print(ret)
ret = db_session.query(User).filter(or_(User.id == 4, User.name == 'fengchong123')).all() #or
print(ret)
ret = db_session.query(User).filter_by(id=4,name="fengchong123").all() #and
print(ret) # 查询所有数据
r1 = db_session.query(User).all() # 查询数据 指定查询数据列 加入别名
r2 = db_session.query(User.id.label("uid"),User.name.label("username")).first()
print(r2.uid,r2.username) # 表达式筛选条件
r3 = db_session.query(User).filter(User.name == "fengchong").all() # 原生SQL筛选条件
r4 = db_session.query(User).filter_by(name='fengchong').all()
r5 = db_session.query(User).filter_by(name='fengchong').first() # 字符串匹配方式筛选条件 并使用 order_by进行排序
from sqlalchemy.sql import text
r6 = db_session.query(User).filter(text("id=:value and name=:name")).params(value=3, name='fengchong').first()
print(r6.name) # 原生SQL查询
r7 = db_session.query(User).from_statement(text("SELECT * FROM User where name=:name")).params(name='fengchong').all() # 筛选查询列
# query的时候我们不在使用User ORM对象,而是使用User.name来对内容进行选取
user_list = db_session.query(User.name).all()
print(user_list)
for row in user_list:
print(row.name) # 别名映射 name as nick
user_list = db_session.query(User.name.label("nick")).all()
print(user_list)
for row in user_list:
print(row.nick) # 这里要写别名了 # 筛选条件格式
user_list = db_session.query(User).filter(User.name == "fengchong").all()
user_list = db_session.query(User).filter(User.name == "fengchong").first()
user_list = db_session.query(User).filter_by(name="fengchong").first()
for row in user_list:
print(row.nick) # 复杂查询
from sqlalchemy.sql import text
user_list = db_session.query(User).filter(text("id<:value and name=:name")).params(value=3,name="fengchong") # 查询语句
from sqlalchemy.sql import text
user_list = db_session.query(User).filter(text("select * from User id<:value and name=:name")).params(value=3,name="fengchong") # 排序 :
user_list = db_session.query(User).order_by(User.id.asc()).all()
user_list = db_session.query(User).order_by(User.id.desc()).all()
for row in user_list:
print(row.name,row.id) # 其他查询条件
"""
ret = session.query(User).filter(User.id.between(1, 3), User.name == 'fengchong').all() # between 大于1小于3的
ret = session.query(User).filter(User.id.in_([1,3,4])).all() # in_([1,3,4]) 只查询id等于1,3,4的
ret = session.query(User).filter(~User.id.in_([1,3,4])).all() # ~xxxx.in_([1,3,4]) 查询不等于1,3,4的
ret = session.query(User).filter(User.id.in_(session.query(User.id).filter_by(name='fengchong'))).all() 子查询 # 通配符
ret = db_session.query(User).filter(User.name.like('e%')).all()
ret = db_session.query(User).filter(~User.name.like('e%')).all() # 限制
ret = db_session.query(User)[1:2] # 排序
ret = db_session.query(User).order_by(User.name.desc()).all()
ret = db_session.query(User).order_by(User.name.desc(), User.id.asc()).all() # 分组
from sqlalchemy.sql import func
ret = db_session.query(
func.max(User.id),
func.sum(User.id),
func.min(User.id)).group_by(User.name).all() ret = db_session.query(
func.max(User.id),
func.sum(User.id),
func.min(User.id)).group_by(User.name).having(func.min(User.id) >2).all()
"""

高级查询操作

高级版修改操作

#直接修改
# db_session.query(User).filter(User.id > 0).update({"name" : "099"}) #在原有值基础上添加 - 1
db_session.query(User).filter(User.id > 0).update({User.name: User.name + ""}, synchronize_session=False)
db_session.commit() #在原有值基础上添加 - 2
# db_session.query(User).filter(User.id > 0).update({"age": User.age + 1}, synchronize_session="evaluate")
# db_session.commit()

高级修改操作

四、一对多表的增删改查

创建数据表及关系relationship

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship class Student(Base):
__tablename__ = "student"
id = Column(Integer,primary_key=True)
name = Column(String(32))
school_id = Column(Integer,ForeignKey("school.id")) stu2sch = relationship("School",backref="sch2stu") #backref用于反向查询 class School(Base):
__tablename__= "school"
id = Column(Integer,primary_key=True)
name = Column(String(32)) from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:口令@127.0.0.1:3306/数据库名?charset=utf8") Base.metadata.create_all(engine)

create_table_ForeignKey.py

基于relationship增加数据

from create_table_ForeignKey import engine,Student,School
#创建会话窗口
from sqlalchemy.orm import sessionmaker
#创建会话对象
Session = sessionmaker(engine)
#打开会话对象
db_session = Session() ##############1.正向添加数据#################
stu_obj = Student(name="baozi",stu2sch=School(name="北京大学"))
db_session.add(stu_obj)
db_session.commit() ##############2.反向添加数据第一种写法##################
sch_obj = School(name="天津大学")
sch_obj.sch2stu = [Student(name="xiena"),Student(name="hejiong")]
db_session.add(sch_obj)
db_session.commit() ##############2.反向添加数据第二种写法
sch_obj = School(name="清华大学",sch2stu = [Student(name="维嘉"),Student(name="吴昕")])
db_session.add(sch_obj)
db_session.commit()

curd_ForeignKey_insert.py

基于relationship查询数据

#查询数据
from create_table_ForeignKey import engine,Student,School
#创建会话窗口
from sqlalchemy.orm import sessionmaker
#创建会话对象
Session = sessionmaker(engine)
#打开会话窗口
db_session = Session() ##############1.正向数据查询###############
stu_list = db_session.query(Student).all()
for row in stu_list:
print(row.id,row.name,row.school_id,row.stu2sch.name) ##############2.反向数据查询################
sch_list = db_session.query(School).all()
for school in sch_list:
for student in school.sch2stu:
print(school.id,school.name,student.name)

curd_ForeignKey_select.py

更新数据

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine,Student,School Session = sessionmaker(engine)
db_session = Session() # 修改数据
sch = db_session.query(School).filter(School.name=="清华大学").first()
db_session.query(Student).filter(Student.name == "小笼包").update({"school_id":sch.id})
db_session.commit()
db_session.close()

curd_ForeignKey_update

删除数据

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine,Student,School Session = sessionmaker(engine)
db_session = Session() # 删除数据
sch = db_session.query(School).filter(School.name=="北京大学").first()
db_session.query(Student).filter(Student.school_id == sch.id).delete()
db_session.commit()
db_session.close()

curd_ForeignKey_delete.py

五、多对多表的增删改查

创建表及表关系

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship class Girls(Base):
__tablename__ = "girl"
id = Column(Integer,primary_key=True)
name = Column(String(32)) #创建关系
girl2boy = relationship("Boys",secondary="hotel",backref="boy2girl") class Boys(Base):
__tablename__ = "boy"
id = Column(Integer, primary_key=True)
name = Column(String(32)) class Hotel(Base):
__tablename__ = "hotel"
id = Column(Integer,primary_key=True)
girl_id = Column(Integer,ForeignKey("girl.id"))
boy_id = Column(Integer,ForeignKey("boy.id")) from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:口令@127.0.0.1:3306/数据库名?charset=utf8")
Base.metadata.create_all(engine)

M2M.py

基于relationship增加数据

from sqlalchemy.orm import sessionmaker
from M2M import engine,Boys,Girls Session = sessionmaker(engine)
db_session = Session() #1.反向添加
boy_obj = Boys(name="haha",boy2girl = [Girls(name="赵丽颖"),Girls(name="陈妍希")])
db_session.add(boy_obj)
db_session.commit() #2.正向添加
girl_obj = Girls(name="笑笑",girl2boy=[Boys(name="小土狗"),Boys(name="大狼狗")])
db_session.add(girl_obj)
db_session.commit()

M2M_curd_add.py

基于relationship查询数据

from sqlalchemy.orm import sessionmaker
from M2M import engine,Boys,Girls Session = sessionmaker(engine)
db_session = Session() # 1.查询 relationship 正向
g_list = db_session.query(Girls).all()
for girl in g_list:
for boy in girl.girl2boy:
print(girl.name,boy.name) # 2.查询 relationship 反向
b_list = db_session.query(Boys).all()
for boy in b_list:
for girl in boy.boy2girl:
print(boy.name,girl.name)

M2M_curd_query

SQLAlchemy的基础使用的更多相关文章

  1. SQLAlchemy 教程 —— 基础入门篇

    SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...

  2. sqlalchemy之基础操作

    原文链接:https://www.cnblogs.com/DragonFire/p/10166527.html

  3. SQLAlchemy(包含有Flask-Migrate知识点)

    what's the SQLAlchemy SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQ ...

  4. 测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作

    flask-SQLAlchemy是在原生SQLAlchemy的基础之上做了一层封装,安装flask-SQLAlchemy会自动安装SQLAlchemy 安装 传统的sql建表建字段 通过flask-S ...

  5. python数据的存储和持久化操作

    Python的数据持久化操作主要是六类:普通文件.DBM文件.Pickled对象存储.shelve对象存储.对象数据库存储.关系数据库存储. 普通文件不解释了,DBM就是把字符串的键值对存储在文件里: ...

  6. SQLAlchemy基础操作二

    多线程示例 import time import threading from sqlalchemy.ext.declarative import declarative_base from sqla ...

  7. SQLAlchemy基础操作一

    用前安装 pip3 install sqlalchemy ORM ORM就是运用面向对象的知识,将数据库中的每个表对应一个类,将数据库表中的记录对应一个类的对象.将复杂的sql语句转换成类和对象的操作 ...

  8. sqlalchemy基础教程

    一.基本配置 连接数据库 外部连接数据库时,用于表名数据库身份的一般是一个URL.在sqlalchemy中将该URL包装到一个引擎中,利用这个引擎可以扩展出很多ORM中的对象. from sqlalc ...

  9. SQLAlchemy 快速入门、基础知识

    SQLAlchemy 是Python 编程语言下的一款开源软件.提供了SQL工具包及对象关系映射(ORM)工具. ORM, 全称Object Relational Mapping, 中文叫做对象关系映 ...

随机推荐

  1. 基于hap的文件上传和下载

    序言 现在,绝大部分的应用程序在很多的情况下都需要使用到文件上传与下载的功能,在本文中结合hap利用spirng mvc实现文件的上传和下载,包括上传下载图片.上传下载文档.前端所使用的技术不限,本文 ...

  2. Idea插件之IdeTalk

    前言 随着越来越多的公司与Java工程师,逐步从Eclipse过度到Idea,安装相应的插件可能会成倍的增加工作效率. IDETalk是由JetBrains的工程师开发的一款代码级的协同工具,主要是为 ...

  3. 离线服务器安装zabbix

    因为机房内的服务器并不是所有都能上外网,所以利用zabbix官方源的安装方法就行不通了,又嫌弃编译安装麻烦,所以这里选择离线RPM包安装zabbix.(如需完整rpm包可以留言与我联系) 下载zabb ...

  4. Scala 学习笔记之集合(4)

    集合的模式匹配操作: object CollectionDemo5 { def main(args: Array[String]): Unit = { //集合模式匹配1 val ls = List( ...

  5. Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)

    Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等. 下面是这几种客户端的常见用法. 一.原生Java客户端 原生java客户端 ...

  6. Java8新特性时间日期库DateTime API及示例

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...

  7. Redis Sentinel(哨兵核心机制) 初步深入

    ##### 1.Redis 的 Sentinel 系统用于管理多个 Redis 服务 该系统执行以下三个任务:  1.监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务 ...

  8. UWP 使用新版画中画 FontIcon —— 如何使用自定义字体 —— 简单分析Windows Calculator源代码

    微软在新版UWP计算器中加入了一个“置顶”功能,它相当于我们之前看视频的“画中画”一样. 点击后窗体置顶,同时可以进行其他任务. 有的小伙伴说,不就是一个图标吗,去 Segoe MDL2 图标 把图标 ...

  9. 记个mimikatz小坑

    今晚回学校无聊搞搞自己school  实战的时候遇到mimikatz抓密码报错  以前没遇过 记一下(水一篇) 爆ERROR kuhl_m_privilege_simple ; RtlAdjustPr ...

  10. 域渗透-凭据传递攻击(pass the hash)完全总结

    总结下PtH具体形式(wmicexec.powershell.msf等) 0x01 PtH攻击原理 && 黄金白银票据 PtH攻击原理 wiki  https://en.wikiped ...