今天来聊一聊 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. python2和python3的区别

    python2和python3的区别 参考链接:http://www.runoob.com/python/python-2x-3x.html 1.源码上的区别 python2 python3 源码不规 ...

  2. nodeJS模块寻址规则

    引子 阮一峰一则教程中, 将应用放置在  npm 模块安装目录同等级的目录(https://github.com/ruanyf/webpack-demos)下. 但是应用目录文件中, 引用标准库的使用 ...

  3. 【bzoj 4449】[Neerc2015]Distance on Triangulation

    Description 给定一个凸n边形,以及它的三角剖分.再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b. I ...

  4. MVC实例应用模式

    MVC实例应用模式 1.可用性: 比如异常处理 2.可修改性: 比如用接口实现 3.性能战术: 4.易用性战术: 分层实现 5.可测试性战术: 实现对其接口进行测试,并不需要对其实现方法进行 6.安全 ...

  5. ubuntu 装机必备

    在github上下载高博的slambook(https://github.com/gaoxiang12/slambook)在3rdparty文件夹中有安装包. 1. 安装Eigen库 sudo apt ...

  6. Android Ndef Message解析

    @concept:NDEF NFC Form论坛定义的NFC数据交换通用数据格式. 如上所示:一条NDEF消息由诸多Record记录组成,Record又由Header和Payload组成,Header ...

  7. gradle 编译 "aapt.exe'' finished with non-zero exit value 1 问题

    升级了一下android studio的版本,从3.0升级到3.3,升级过后,编译确实快了不少,但项目导入后一直报 "aapt.exe'' finished with non-zero ex ...

  8. Ubuntu下使用Sublime Text 3配置Python开发环境

    因为电脑配置有些低端,所以只能使用Sublime来当作Python的IDE. 1.下载Sublime Text 3并安装 首先去官网找到64位的.tar.bz2的压缩文件下载: 使用命令或归档管理器将 ...

  9. 【译】索引进阶(十三):SQL SERVER中的索引碎片【下篇】

    原文链接:传送门. 通用碎片模式 如果一个表具有多个索引,那么这些索引便具有多个索引键,因而也具有不同的顺序.通常情况下,这些索引中的一两个展示了之前描述过的升序插入模式,而其他的通常展示了随机插入模 ...

  10. 区块链之智能合约 solidity踩坑 --上篇

    概述 最近在写合约时遇到一些坑,做一下总结: 介绍主要分一下三个方面: 对区块链的简单描述 结合业务场景,编写简单智能合约,时遇到的坑(上篇) assembly 的使用说明(下篇) 正文 进入正题之前 ...