ORM之SQLALchemy
今天来聊一聊 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的更多相关文章
- python(十二)下:ORM框架SQLAlchemy使用学习
此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...
- 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库
MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...
- ORM框架SQLAlchemy的使用
ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...
- 【Python】ORM框架SQLAlchemy的使用
ORM和SQLAlchemy简介 对象关系映射(Object Relational Mapping,简称ORM),简单的来说,ORM是将数据库中的表与面向对象语言中的类建立了一种对应的关系.然后我们操 ...
- python的ORM框架SQLAlchemy
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 一.ORM介绍 如果写程序用pymysql和程序交互,那是不是要写原生sql语句 ...
- Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块
ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...
- Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例
sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...
- Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式
sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...
- Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式
sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...
随机推荐
- python学习06
流控制 和函数 1)流控制 1.条件语句 if elif else if else 2.循环语句 while for 3.continue 和break continue是跳过本次循环,执行下一次循 ...
- Thunar 通过快捷键在当前文件夹打开终端
参考『Keyboard shortcut for open terminal here in thunar』\(^{[1]}\) 在 ganiserb/thunar-terminal 下载脚本. 将脚 ...
- 美图秀秀api实现图片的裁剪及美化
美图秀秀不仅有PC版.手机版等客户端的软件,还有Web开方接口,可以在web页面上调用美图秀秀的api接口,实现图片的编辑.像淘宝.网易.qq空间.新浪微博等大厂都使用过该接口. 官网地址:http: ...
- 2019年一次java知识点总结
java基础 数据类型 集合与数据结构 关键字(static,rty ...) IO和网络 多线程(并发与锁,死锁) 异常 简单算法,复杂度 JVM 类加载 java内存模型 对象监听器字节码 垃圾回 ...
- 使用chrome开发者工具中的performance面板解决性能瓶颈
前面的话 使用Chrome DevTools的performance面板可以记录和分析页面在运行时的所有活动.本文将详细介绍如何使用performance面板解决性能瓶颈 准备 [匿名模式] 匿名模式 ...
- python把列表前几个元素提取到新列表
需要添加几个就循环几次 list = ['a','b','c','d','e'] new_list = [] for i in range(3): print(list[i]) new_list. ...
- EntityFramework6之原生SQL
原文:https://www.cnblogs.com/wujingtao/p/5412329.html 用EF执行SQL又比ADO.NET方便,特别是在执行查询语句的时候,EF会把查询到的数据自动保存 ...
- yii2修改默认控制器
---------------------------------- 默认的控制器为site,修改文件 vendor\yiisoft\yii2\web\Application.php public $ ...
- (原创)lua日期、时间、时间戳的计算和转换
----------------------------------------------日期与时间 print("当前时间戳:") local nowTime = os.tim ...
- 电脑移动后WIFI连接失败解决方法
1.现象原因 经常会发现将自己的电脑带到不同的地方后连接附近WIFI失败的现象,这是什么原因造成的了,觉得明明之前还有连过这个无线,密码都是正确的,无线连接的图标显示一个大大大的感叹号! 像下面一样 ...