小工具      在线工具  汉语词典  css  js  c++  java

ORM简介

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

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

我们知道,对数据库的所有操作都是使用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. 对象关系映射:对象关系映射。将数据转换为Python对象
  2. 数据库中的表 —> python 对象
  3. 表中的列是列的属性
  4. 表中的每一行对应于该类的一个实例
  5. 字典中的key对应实例,value对应值。
  6. 实现面向对象的增删改查操作封装

实现代码:

  1. 简单case封装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 sql


user=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框架主要用于前端渲染。查询操作的关键是查询、过滤等功能。修改和删除主要涉及修改查询结果和删除delete。
具体学习参照:SQL炼金术
基本实现步骤:SQLAlchemy ORM 教程
具体操作函数:sqlalchemy执行mysql数据库操作

. . .

相关推荐

额外说明

java映射处理器内部错误java.lang.NullPointerException的解决办法

java Internal error in the mapping processor java.lang.NullPointerException java: Internal error in the mapping processor: java

额外说明

Redis的CAS并发竞赛和zookeeper的分布式锁解决方案

面试题 redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS (Check-And-Swap)方案吗? CAS Compare And Swap,即 CAS,是一种乐观锁,java 的原子类就是利用的 CAS 来实现了并发

额外说明

Win10 64位双系统UEFI官网下载镜像安装(无需PE)

1. 刻录Win10 ISO镜像 2. U盘UEFI启动 先设置BIOS,Boot Mode:UEFI, Secure Boot: OFF 3. 在“要安装的语言”界面,按shift+F10调出DOS窗口 4. 对磁盘分区操作 diskpart list

额外说明

Java网络 1.20 题目练习

题目练习 第一题 第二题 第三题 第一题 第二题 第三题

额外说明

C语言实现:爱因斯坦的阶梯问题

C语言实现:爱因斯坦的阶梯问题 文章目录 C语言实现:爱因斯坦的阶梯问题 1. 问题 2. 解决方案 3. 实现代码 4. 执行结果 5. 解决方法说明——穷举法 1. 问题 爱因斯坦的阶梯问题:爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上

额外说明

使用 rtk-query 优化你的数据请求

一、目前前端常见的发起ajax请求的方式 1、使用原生的ajax请求 2、使用jquery封装好的ajax请求 3、使用fetch发起请求 4、第三方的比如axios请求 5、angular中自带的HttpClient 就目前前端框架开发中来说我们在开发

额外说明

Android学习笔记(五)——Toast提示、Dialog对话框、Menu菜单

android中的提示机制: Toast AlertDialog Notification 一、Toast。 Toast消息提示框是轻量级的信息提醒机制,显示在应用程序界面的最上层。一般用于提示一些不那么引人注目,但是又希望用户看见的信息,无需用户自己维

额外说明

列表视图案例2——显示用户列表

列表视图案例2——显示用户列表 一、运行效果 二、实现步骤

额外说明

打开软件出现找不到vbalIml6.ocx文件的解决办法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个vbalIml6.ocx文件

额外说明

使用javaAPI创建主题、分区数量、副本数量、数据保留时间

代码如下所示: 类一: public class BasicInfo { public TopicDescription topicExistence(String ipPort, String topicName){ Bas

ads via 小工具