SQLAlchemy ORM框架

article/2025/10/19 7:23:13

ORM简介

ORM 全称 Object Relational Mapping, 叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。

对于数据的操作增、删、查、改(主要是查)得到的只是一个字符串没办法显示在前端界面。但用面向对象语言与类建立映射(mapping)后将得到的字符存储在内存中,在声明周期类显示在界面上。

我们知道操作数据库都是用SQL语句执行的:

  1. 建数据库
create database  person;
  1. 建表
create table man(id int primary key,name varchar(16) not null,age int,sex  varchar(2)
);
  1. 插入数据
insert into man(id,name,age,sex)
values (1,'张三',22,'男');
  1. 更新数据
update man set name='老王';
  1. 删除数据
delete from man where id = 1;
  1. 查询数据
#查询较复杂
select * from person where name like '%ang';

对于用户来说,并不需要了解数据库,将ORM模型后只需要通过输入参数就能操作数据库,对sql语句进行了封装,那么只需要实例化类并调用类方法就可以操作数据库了。

使用面向对象语言自定义ORM框架

  1. Object-Relational Mapping: 对象-关系映射。把数据转换成python对象
  2. 数据库中的表—> python对象
  3. 表中的列是列的属性
  4. 表中的每一行对应类的实例
  5. 字典中的key对应实例,value对应值
  6. 对增删查改封装实现面向对象化的操作

实现代码:

  1. 简单案例封装sql
sql='update {} set {}=\'{}\' where {}=\'{}\''.format('tt_user','username','zhangyu','username','suyanzeng')
print(sql)结果:
update tt_user set username='zhangyu' where username='suyanzeng'

案例封装的sql是可以直接在数据库中运行的,我们需要传递有效的参数。
2. 类封装sql语句

class User:#初始化为类动态设置属性def __init__(self,**kwargs):for key,value in kwargs.items():self.__setattr__(key,value)def makesql(self,**kwargs):dict=self.__dict__sql = 'insert into table({}) values{}'.format(','.join(list(dict.keys())),tuple(list(dict.values())))   #数据结构的注意这些转换关系return sqluser=User(su=1,nm='nihao',ss='bushi')
print(user.makesql())结果:
insert into table(su,nm,ss) values(1, 'nihao', 'bushi')

可以看到用类封装后实例化类并传入关键参数就构造了sql语句,有了sql语句就可以操作数据库了(表名没生成参数,添加一个参数即可)
3. 类对象实现数据库操作pymsql实现

import pymysql
from pymysql.cursors import DictCursor# 定义类的方法重复调用次数
import sys
sys.setrecursionlimit(10000000)# 对连接数据库操作封装class ConnectMysql:def __init__(self):conn = pymysql.connect(host='localhost', port=3306, user='用户', password='密码',autocommit=True)conn.cursor().execute('use termtask')self.cursor = conn.cursor(DictCursor)     #DictCursor以字典获取数据库中的表# 封装查询操作def select(self, sql:str):self.cursor.execute(sql)result = self.cursor.fetchall()return result# 封装修改等更新操作def update(self,sql:str):if self.cursor.execute(sql):return "UPDATE FINISHED"else:return "UPDATE FAIL"# 封装新增(传入的一列封装为字典类型)def insert(self,sql:str):if self.cursor.execute(sql):return "INSERT FINISHED"else:return "INSERT FAIL"# 关闭封装def close(self):self.cursor.close()self.close()return 0# 将数据库的表封装成对象并实现操作
class Users:table_name='tt_user'#封装查询sql语句def quary(self,userid:str):sql='select {} from {}'.format("userid",self.table_name)print(sql)result=ConnectMysql().select(sql)return result#分装插入sql语句def post(self,**kwargs):  #**kwargs为限定参数为字典类型for key,value in kwargs.items():self.__setattr__(key,value)   #为类动态设置属性,不必输入完全sql = 'insert into {}({}) values{}'.format(self.table_name, ','.join(list(self.__dict__.keys())),tuple(list(self.__dict__.values())))print(sql)'''数据传入方式user=Users()user.post(userid='2',username='chuhailong')数据结构,返回self.__dict__{'userid': '2', 'username': 'chuhailong'}'''result=ConnectMysql().insert(sql)return result#封装更新的sql语句def chenge(self,*args):pass# 对于其他表直接继承即可
''' 调用父类方法
self.__class__.__getatrribute__(self,"表名(User类的table_name)")
super调用父类
'''if __name__ == '__main__':#查询实例对象'''user=Users()result=user.select('userid')print(result)'''user=Users()result=user.post(username='suyanzeng',password='123456',role='user')print(result)

控制栏显示执行成功。
在这里插入图片描述
数据中成功插入数据。
在这里插入图片描述

上面用户名和密码写正确,连接数据库要用pymsyql用pip指令安装 :pip install pymysql 下面的sqlalchemy一样。

SQLAlchemy框架实现ORM模型

# SQLAlchemy框架是python语言开发的ORM框架,使-----
# ---用该框架不需要自己封装sql语句,用其内置函数实现数据库操作
# sqlalchemy 作为python 主流的ORM 框架,
# ORM 全称 Object Relational Mapping, 叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成# 使用sqlalchemy操作数据库
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.engine import row
from sqlalchemy.orm import declarative_base, sessionmaker, session, scoped_session# 建立数据库连接
engine = create_engine('mysql+pymysql://root:baby5429@localhost/termtask')  # termtask数据库名称 ,通过create_engine建立连接返回实例
# 定义映射数据库表和python类的基类
Base = declarative_base()  # Declarative类实现数据库表映射到pyhton内置对象,实例化创建基类
# 创建数据库对话
Session = sessionmaker(bind=engine)
# 自定义的工厂类可以拿来我们构造新的Session
FactorySession = scoped_session(Session)md = MetaData(bind=engine)# 定义模型类即数据表转换的python类的过程(要继承基类才能实现隐射)也就是建立mapping过程
'''
class User(Base):__tablename__="tt_user"    #数据库中的表名#也可以在这里定义表结构用metadata类创建数据库(但没必要)'''class User(Base):__table__ = Table('tt_user', md, autoload=True)  # MetaData类实现表到类的映射if __name__ == '__main__':result = FactorySession.query(User.userid,User.username).filter(User.userid == 3).all()print(result)

在这里插入图片描述
对应数据库表中的id=3
在这里插入图片描述

SQLAlchemy实现增删查改

# SQLAlchemy框架是python语言开发的ORM框架,使-----
# ---用该框架不需要自己封装sql语句,用其内置函数实现数据库操作
# sqlalchemy 作为python 主流的ORM 框架,
# ORM 全称 Object Relational Mapping, 叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成# 使用sqlalchemy操作数据库
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.engine import row
from sqlalchemy.orm import declarative_base, sessionmaker, session, scoped_session# 建立数据库连接
engine = create_engine('mysql+pymysql://root:baby5429@localhost/termtask')  # termtask数据库名称 ,通过create_engine建立连接返回实例
# 定义映射数据库表和python类的基类
Base = declarative_base()  # Declarative类实现数据库表映射到pyhton内置对象,实例化创建基类
# 创建数据库对话
Session = sessionmaker(bind=engine)
# 自定义的工厂类可以拿来我们构造新的Session
FactorySession = scoped_session(Session)md = MetaData(bind=engine)# 定义模型类即数据表转换的python类的过程(要继承基类才能实现隐射)也就是建立mapping过程
'''
class User(Base):__tablename__="tt_user"    #数据库中的表名#也可以在这里定义表结构用metadata类创建数据库(但没必要)'''class User(Base):__table__ = Table('tt_user', md, autoload=True)  # MetaData类实现表到类的映射if __name__ == '__main__':#查询result = FactorySession.query(User.userid,User.username).filter(User.userid == 3).all()print(result)# 查询结果   [(3, 'zhangyu')] 列表中间是字典#新增 实例化映射类user1=User(username='jingchengxin',password='123456',role='user')FactorySession.add(user1)FactorySession.commit()   # 修改操作要提交print("INSERT FINESHED")    #修改需要先查询出来result2 = FactorySession.query(User).filter_by(username='jingchengxin').first()result2.username='unkown'FactorySession.commit()print("UPDATE FINESHED")'''#删除需要先查询出来result1=FactorySession.query(User).filter_by(username='unkown').delete()FactorySession.commit()print('DELETED')'''

初始数据库
在这里插入图片描述
执行代码后结果:
在这里插入图片描述
数据库(没有执行删除操作):
在这里插入图片描述

ORM框架主要用于前端的炫染,查询操作关键是query,filter等函数,修改,删除主要是对查询结果修改和删除delete
具体学习参照:SQLAlchemy
基本实现步骤:SQLAlchemy ORM教程
具体操作函数:sqlalchemy 进行 mysql 数据库操作


http://chatgpt.dhexx.cn/article/6n6Yk9qN.shtml

相关文章

ORM框架

ORM框架 一、什么是ORM框架 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,OR…

ORM框架使用优缺点

1. 什么是ORM? 对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业…

Redis I/O 多路复用

引出IO多路复用 为什么 Redis 中要使用 I/O 多路复用这种技术呢? 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能…

IO多路复用—由Redis的IO多路复用yinch

linux IO多路复用有epoll, poll, select,epoll性能比其他几者要好。 名词比较绕口,理解涵义就好。一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”…

什么是IO多路复用?用来解决什么问题?如何实现?

白话IO多路复用 这里引述知乎大佬对于IO多路复用的机场空管的比喻和理解: 假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接…

I/O多路复用

https://blog.csdn.net/baixiaoshi/article/details/48708347 https://blog.csdn.net/z69183787/article/details/52943917 select,poll,epoll都是IO多路复用的机制。所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符…

概念 多路复用 到底是个啥?通俗易懂的理解

前言:教育的公平才是最大的公平,本科和专科还是有点差别的。时间长点学方面会充实些。 先给个结论:I/O多路复用技术(就是大家经常说的事件循环)实际上,事件驱动模型还有另外一个名字,而且更加出…

Redis的IO多路复用原理

什么是阻塞,非阻塞,异步同步,select,poll,epoll?今天我们用一遍文章解开这多年的迷惑。 首先我们想要通过网络接收消息,是这样的一个步骤。 用户空间向内核空间请求网络数据内核空间把网卡数据…

什么是IO多路复用,理解IO多路复用

什么是IO多路复用? IO 多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪就会阻塞应用程序,交出CPU。 多路是指网…

多路复用与多路分用

从现在开始,我们开始传输层的学习,自顶向下第六版中改成了运输层,感觉怪怪的 书中打了邮政服务和代收发信件的兄弟姐妹之间的比方,非常贴切,这是传输层和网络层的作用区别,也就是说,传输层管的是…

多路复用(

apue 多路复用 需求来自用户,用户的需求来自实际的使用场景。在实际运用中,一个系统或者程序需要处理的事件并不是只有一个或一类,而是存在各种各样的事件在一小段事件内一起发生,此时按照没学多线程的逻辑的处理方式就是这样&…

多路复用

讲多路复用先我觉得有必要讲一下什么是阻塞IO、非阻塞IO、同步IO、异步IO这几个东西;linux的五种IO模型: 1)阻塞I/O(blocking I/O) 2)非阻塞I/O(nonblocking I/O) 3) I/O复用(select和poll)(…

io多路复用的原理和实现_IO多路复用机制详解

select,poll,epoll机制区别总结: 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是…

【多路复用器介绍】

【多路复用器介绍】意义 作用 实现 意义逻辑电路原理结构与真值表逻辑电路 实现代码参考资料 意义 多路复用器将接收的复合数据流,依照信道分离数据,并将它们送到对应的输出线上,故称为解多路复用器。 实际生活中,使用多路复用器…

多路复用技术(频分多路复用、时分多路复用和波分多路复用)

基带信号就是将数字信号1或0直接用两种不同的电压来表示,然后送到线路上去传输。 宽带信号则是将基带信号进行调制后形成的频分复用模拟信号。 多路复用技术的基本原理是:各路信号在进入同一个有线的或无线的传输媒质之前,先采用调制技术把…

8、多路复用技术

这一节,我们介绍信道的多路复用,作为数据通信基础的收尾知识点,这个知识点并没有特别复杂的地方,主要是理解不同的复用技术的特点,在一些考试中也没有多少考点,或者说不做重点。 多路复用技术 先从字面上来…

TCP/IP多路复用

所有网络通信的本质目标就是进程间通信。 除了寻址(Addressing),IP 协议还有一个非常重要的能力就是路由。 寻址告诉我们去往下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径。寻址更像在导航,路由更像…

多路复用,讲的很明白

作者:罗志宇 链接:https://www.zhihu.com/question/32163005/answer/55772739 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 假设你是一个机场的空管, 你需要管理到你机场的所有…

全网最详细的 I/O 多路复用解析

前言 IO多路复用目前在大厂的面试中,一般在两个地方可能会被问到,一个是在问到网络这一块的时候,另一个是在问到 Redis 这一块的时候,因为 Redis 底层也是使用了IO多路复用,所以整体来说 IO多路复用,也算是…

计算机网络基础之多路复用技术

温故: 1、单工传输:单工传输只支持数据在一个方向上传输,数据传送只能在一个方向上进行,任何时候都不能改变方向,就像公路上的单行道,例如无线电广播。 2、半双工传输:半双工传输允许数据在两个方向上传输&…