今天来聊一聊 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. python学习06

    流控制 和函数 1)流控制 1.条件语句 if elif else  if else 2.循环语句 while for 3.continue 和break continue是跳过本次循环,执行下一次循 ...

  2. Thunar 通过快捷键在当前文件夹打开终端

    参考『Keyboard shortcut for open terminal here in thunar』\(^{[1]}\) 在 ganiserb/thunar-terminal 下载脚本. 将脚 ...

  3. 美图秀秀api实现图片的裁剪及美化

    美图秀秀不仅有PC版.手机版等客户端的软件,还有Web开方接口,可以在web页面上调用美图秀秀的api接口,实现图片的编辑.像淘宝.网易.qq空间.新浪微博等大厂都使用过该接口. 官网地址:http: ...

  4. 2019年一次java知识点总结

    java基础 数据类型 集合与数据结构 关键字(static,rty ...) IO和网络 多线程(并发与锁,死锁) 异常 简单算法,复杂度 JVM 类加载 java内存模型 对象监听器字节码 垃圾回 ...

  5. 使用chrome开发者工具中的performance面板解决性能瓶颈

    前面的话 使用Chrome DevTools的performance面板可以记录和分析页面在运行时的所有活动.本文将详细介绍如何使用performance面板解决性能瓶颈 准备 [匿名模式] 匿名模式 ...

  6. python把列表前几个元素提取到新列表

    需要添加几个就循环几次   list = ['a','b','c','d','e'] new_list = [] for i in range(3): print(list[i]) new_list. ...

  7. EntityFramework6之原生SQL

    原文:https://www.cnblogs.com/wujingtao/p/5412329.html 用EF执行SQL又比ADO.NET方便,特别是在执行查询语句的时候,EF会把查询到的数据自动保存 ...

  8. yii2修改默认控制器

    ---------------------------------- 默认的控制器为site,修改文件 vendor\yiisoft\yii2\web\Application.php public $ ...

  9. (原创)lua日期、时间、时间戳的计算和转换

    ----------------------------------------------日期与时间 print("当前时间戳:") local nowTime = os.tim ...

  10. 电脑移动后WIFI连接失败解决方法

    1.现象原因 经常会发现将自己的电脑带到不同的地方后连接附近WIFI失败的现象,这是什么原因造成的了,觉得明明之前还有连过这个无线,密码都是正确的,无线连接的图标显示一个大大大的感叹号!  像下面一样 ...