今天来聊一聊 Python 的 ORM 框架 SQLAlchemy

SQLAlchemy 没有 Django 的 Models 好用!因为models是Django自带的ORM框架,也正是因为是Django原生的,所以兼容性远远不如SQLAlchemy

真正算得上全面的ORM框架必然是我们的SQLAlchemy ORM框架,它可以在多语言中使用SQL查询

SQLAlchemy 如何使用:

一.下载

pip isntall  SQLALchemy

二.创建数据表

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()  # Base是 ORM模型的基类
# ORM模型:
# obj里面的属性 == table中创建的字段
# obj定义table的操作方式和属性 from sqlalchemy import Column, Integer, INT, INTEGER, VARCHAR, String # 1.创建一个class
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(32), index=True) # 2.创建数据引擎
from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/sqlalchemy_test?charset=utf8") # 3.将所有继承Base的class序列化成数据表
Base.metadata.create_all(engine)

三 . 增删改查操作

1.增加数据

# 可视化工具中,分四步操作数据
# .选中数据库 - 创建数据库引擎 导入数据库引擎
# .创建查询窗口,必须是选中数据库的查询窗口
# .创建sql语句
# .点击运行 # .选中数据库 - 创建数据库引擎 导入数据库引擎
from create_table import engine # .创建查询窗口,必须是选中数据库的查询窗口
from sqlalchemy.orm import sessionmaker Session_window = sessionmaker(engine)
# 打开查询窗口
db_session = Session_window() # .增加数据 原生sql
# insert into table(字段) value('')
# from create_table import User # 获取User类
#
# user_obj = User(name='小明') # 相当于创建sql语句
# db_session.add(user_obj) # 将sql语句粘贴到查询窗口中
# db_session.commit() # 执行全部语句
# db_session.close() # 关闭连接 # # .增加多条数据
from create_table import User user_obj_list = [User(name='赵丽颖'), User(name='江疏影')]
db_session.add_all(user_obj_list) # 添加所有的语句
db_session.commit()
db_session.close()

添加数据

2.查询数据

# 原生sql语句
# select * from table # 创建查询窗口
from create_table import engine, User
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) # 创建数据引擎
db_session = Session() # 打开查询窗口 # # 1.查询数据
user_obj = db_session.query(User).first()
print(user_obj.id, user_obj.name) # 1 小明 # 第一个数据 user_obj_list = db_session.query(User).all()
for user in user_obj_list:
print(user.id, user.name) # 所有的数据 # 2.带条件的查询
# 2.1 根据表达式获取数据
user_obj_list = db_session.query(User).filter(User.id <= 2, User.name == '赵丽颖').all()
print(user_obj_list)
for user in user_obj_list:
print(user.id, user.name) # 根据id条件和name的名字获取到数据 # 根据指定条件获取数据
user_obj_list = db_session.query(User).filter_by(id=2, name="赵丽颖").all()
print(user_obj_list)
for user in user_obj_list:
print(user.id, user.name)

简单查询

3.修改更新数据

# 原生sql:   update table set name = '123'

# 创建查询窗口
from create_table import engine, User
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) # 创建数据引擎
db_session = Session() # 打开查询窗口 # 1. 修改一条数据
user_obj = db_session.query(User).filter(User.id == 1).update({'name': '小明1'})
print(user_obj) # 打印的是库中受影响的数量
db_session.commit() # 修改多条数据
user_obj = db_session.query(User).filter(User.id >= 1).update({'name': ''})
db_session.commit() # name 全部修改为 111

修改数据

4.删除数据

# sql原生:    delete from table

# 创建查询窗口
from create_table import engine, User
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) # 创建数据引擎
db_session = Session() # 打开查询窗口 # 1.删除单条数据
res = db_session.query(User).filter(User.id == 1).delete()
db_session.commit() # 2.删除多条数据
res = db_session.query(User).filter(User.id>=1).delete()
db_session.commit()

删除数据

四 . 一对多的操作

1.创建数据表及关系relationship

from sqlalchemy.ext.declarative import declarative_base  # 导入 sqlalchemy 基类

from sqlalchemy import Column, INT, VARCHAR, ForeignKey  # 导入字段和类型
from sqlalchemy.orm import relationship # 从orm中导入relationship的关系映射 Base = declarative_base() # 实例化一个基类 class School(Base):
__tablename__ = 'school'
id = Column(INT, primary_key=True)
name = Column(VARCHAR(32)) class Student(Base):
__tablename__ = 'student'
id = Column(INT, primary_key=True) # int + 主键 默认自增长
name = Column(VARCHAR(32))
# 这里的ForeignKey一定要是 表名.id 不是对象名
school_id = Column(INT, ForeignKey('school.id')) # 对应学校的外键 # 将student和school 创建关系,这个不是字段 ,只是关系, backref是反向关联的关键字
stu2sch = relationship('School', backref='sch2stu') # 创建引擎
from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/sqlalchemy_test?charset=utf8') Base.metadata.create_all(engine) # 创建表

创建表

2.基于relationship增加数据

from sqlalchemy.orm import sessionmaker
from foreingKey一对多.create_table_ForeignKey import engine, School, Student # 创建操作窗口
Session = sessionmaker(engine)
db_session = Session() # 1.增加数据
# # 添加学校表数据
# sch_obj = School(name='beijingSchool')
# db_session.add(sch_obj)
# db_session.commit()
#
# # # 笨办法
# # 获取学校对象
# sch_obj = db_session.query(School).filter(School.name == 'beijingSchool').first()
# # 将要写入的学生对象
# stu_obj = Student(name='小明', school_id=sch_obj.id) # 写入关联的学校
# db_session.add(stu_obj)
# db_session.commit() # # 2 Relationship 版 添加数据操作 - 正向
# stu_obj = Student(name='小红', stu2sch=School(name='beijingSchool'))
# db_session.add(stu_obj)
# db_session.commit() # 3 Relationship 版 添加数据操作 - 反向
sch_obj = School(name="beijingSchool")
sch_obj.sch2stu = [Student(name="赵丽颖"),Student(name="陈妍希")]
db_session.add(sch_obj)
db_session.commit()

增加数据

3.基于relationship查询数据

from sqlalchemy.orm import sessionmaker
from foreingKey一对多.create_table_ForeignKey import engine, School, Student Session = sessionmaker(engine)
db_session = Session() # # 1.查询 笨
# sch_obj = db_session.query(School).filter(School.name == 'beijingSchool').first()
# beijing_stu_obj = db_session.query(Student).filter(Student.school_id == sch_obj.id).first()
# print(beijing_stu_obj.id, beijing_stu_obj.name) # # 2.relationship 正向查询
# stu_obj = db_session.query(Student).filter(Student.name=='小明').first()
# print(stu_obj.name, stu_obj.stu2sch.name) # # 3.relationship 反向查询
# sch_obj_list = db_session.query(School).all()
# for sch_obj in sch_obj_list:
# for stu in sch_obj.sch2stu:
# print(sch_obj.name, stu.name)

查询数据

五 . 多对多的操作

1.创建表关系

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()  # d导入并创建基类

# 导入字段和属性   导入orm 的关系映射
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))
g2b = relationship('Boys', backref='b2g', secondary='hotel') # 建立GirlS 和Boys的关系映射 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)
boy_id = Column(Integer, ForeignKey("boy.id")) # boy 的外键
girl_id = Column(Integer, ForeignKey("girl.id")) # girl 的外键 # 创建引擎
from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/sqlalchemy_test?charset=utf8') Base.metadata.create_all(engine) # 创建表

多对多表创建

2.基于relationship增加数据

from 多对多.create_table_m2m import engine, Boys, Girls, Hotel
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine)
db_session = Session() # 1.增加数据 - relationship 正向
#
# girl_obj = Girls(name="赵丽颖")
# girl_obj.g2b = [Boys(name="小明")]
# db_session.add(girl_obj)
# db_session.commit() # 2.增加数据 - relationship 反向 boy_obj = Boys(name="小刚")
boy_obj.b2g = [Girls(name=""),Girls(name="")]
db_session.add(boy_obj)
db_session.commit()

增加数据

3.基于relationship查询数据

from 多对多.create_table_m2m import engine, Boys, Girls, Hotel
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine)
db_session = Session() # 1.查询数据 - relationship 正向
girl_obj_list = db_session.query(Girls).all()
for girl in girl_obj_list:
for boy in girl.g2b:
print(girl.name,boy.name) # 2.查询数据 - relationship 反向
boy_obj_list = db_session.query(Boys).all()
for boy in boy_obj_list:
for girl in boy.b2g:
print(girl.name, boy.name)

查询数据

ORM之SQLALchemy的更多相关文章

  1. python(十二)下:ORM框架SQLAlchemy使用学习

    此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...

  2. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  3. ORM框架SQLAlchemy的使用

    ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...

  4. 【Python】ORM框架SQLAlchemy的使用

    ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...

  5. python的ORM框架SQLAlchemy

    本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业  一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句 ...

  6. Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块

    ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...

  7. Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例

    sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...

  8. Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式

    sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...

  9. Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式

    sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...

随机推荐

  1. EF Core系列

    一. 二. 三. 系列章节 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例) 第X节:XXXXXXXXXXXXXXXXXXXXXXX ...

  2. 基于IPV6的数据包分析(GNS3)

    1.拓扑图 2.配置ipv6地址.使路由器之间可互ping,用ospf配置.(R5为例) 查看路由表 试R5 ping 到R4 R4 ping到 R1 3.开始抓包分析 128返回请求(Echo Re ...

  3. python学习08

    python中的异常处理 1.格式 try 语句块 except else finally else 是如果try语句没有异常,就执行,否则不执行 finally 不管程序是否异常,都会执行. 2.异 ...

  4. zipline框架--简介

    Zipline is a Pythonic algorithmic trading library. It is an event-driven system for backtesting. Zip ...

  5. 基本DFS与BFS算法(C++实现)

    样图: DFS:深度优先搜索,是一个不断探查和回溯的过程,每探查一步就将该步访问位置为true,接着在该点所有邻接节点中,找出尚未访问过的一个,将其作为下个探查的目标,接着对这个目标进行相同的操作,直 ...

  6. 【C#第一天】数据相关

    程序的基本任务:对数据进行处理. 数据分为常量和变量. 变量本质上是内存的空间,用来存储信息. 数据类型:本质上是数据的存储方式及其能参与运算的抽象. 数据类型分两大类:值类型(Value Type) ...

  7. map集合的常用方法

    package test; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ja ...

  8. SpringMVC-简单总结

    要学习一项技术,首先要知道, 它是什么, 为什么要用它 , 它由哪些东西组成, 每个东西是干什么的, 它们怎么综合在一起的 参考博客: 平凡希: https://www.cnblogs.com/xia ...

  9. java学习笔记09-类与对象

    物以类聚,人以群分,我们把具有相似特性或品质的物体归为一类. 类:类是一种模板,它描述一类对象的行为和状态. 对象:对象是类的一个实例,有状态和行为. 比如在一支nba球队中,每个球员都有球衣号码,场 ...

  10. Linux 系统调用sysconf

    1.前言 当前计算机都是多核的,linux2.6提供了进程绑定cpu功能,将进程指定到某个core上执行,方便管理进程.linux提供了sysconf系统调用可以获取系统的cpu个数和可用的cpu个数 ...