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 访问方式. ...
随机推荐
- canvans生成图片<p>标签文字不居中
尝试使用magin 0px auto ;width:100%解决.
- luogu 2157 状压dp
f[i][j][k]分别代表1-i-1个人全部打完饭时i及其后7个人的状态为j时最后一个打饭的人为i+k的状态下所用的最小时间 当i已经打过饭时 即 j&1 那么 f [i] [j>&g ...
- java(12)字符串
一.字符串概述 1.1如何使用字符串 1)定义并初始化字符串 2)使用字符串,对字符串进行一些处理 1.2字符串的长度 语法: 字符串1.length(); -->返回字符串1的长度 publ ...
- Supervisor的安装以及使用
1.supervisor的介绍 Supervisor 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统,通过配置可以实 ...
- selenium定位方式-Xpath使用方法
什么是Xpath? XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素. 一. 在火狐浏览器上安装Xpath 方法如下: 1.使用 Firefox 访问 https://a ...
- 软件测试自动化…python学习到什么程度?代码好不好学!
软件测试自动化…python学习到什么程度?代码好不好学! 如下:
- Docker-----仓库
安装registry 安装并启动docker yum -y install docker systemctl enable docker systemctl start docker 下载regist ...
- Beans 自动装配
http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html
- [转】Python--遍历列表时删除元素的正确做法
转自:https://blog.csdn.net/cckavin/article/details/83618306 一.问题描述 这是在工作中遇到的一段代码,原理大概和下面类似(判断某一个元素是否 ...
- git知识总结-1.git基础之git reference
1.前言 Git版本管理的内容,是一系列由40bytes SHA-1字符串所代表patch,而Git References,则是对这些字符串的引用(也可以理解为别名).为什么需要别名呢?因为这些字符串 ...