小工具      在线工具  汉语词典  dos游戏  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数据库操作

. . .

相关推荐

额外说明

idea2019.1.3配置grails的sdk (曲线救国)

  实在没有找到可配置的地方,就新new个项目配置!!! 这样操作后,需要配置的项目也就自动可以用了。 这也算是另类配置吧。  

额外说明

推荐系统[七]:推荐系统通用技术架构(Netfilx等)、API服务接口

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、

额外说明

C#——委托

C#——委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。 委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用

额外说明

最优化——单纯形法,单纯形表的求取

最优化——单纯形法 一般性线性规划标准型为对象总结其基本步骤 max ⁡ z  s.t.  P 1 x 1 + P 2 x 2 + ⋯ + P n x n = b ⃗ − − − ( 1 ) c 1 x 1 + c 2 x 2 + ⋯ + c n x n

额外说明

Keras深度学习实战(25)——使用skip-gram和CBOW模型构建单词向量

Keras深度学习实战(25)——使用skip-gram和CBOW模型构建单词向量 0. 前言 1. skip-gram 和 CBOW 模型 1.1 CBOW 模型基本原理 1.2 skip-gram 模型基本原理 2. 构建单词向量 2.1 数据集分析

额外说明

java数据结构之快速排序

排序算法是java数据结构的基础,也是程序员必备的基础算法之一,个人认为,了解并掌握排序算法的思想比起单纯用代码实现功能更有意义,毕竟创造这套算法的思想才是最高的智慧嘛,下面就来说说关于排序算法中的比较经典的算法——快速排序; 先用几张示意图来说说快速排

额外说明

[JAVAee]spring-Bean对象的执行流程与生命周期

执行流程 spring中Bean对象的执行流程大致分为四步: 启动Spring容器 实例化Bean对象 Bean对象注册到Spring容器中 将Bean对象装配到所需的类中 ①启动Spring容器,在main方法中获取spring上下文对象并配备spri

额外说明

安卓讲课笔记4.3 安卓手势编程

文章目录 零、学习目标 一、导入新课 二、新课讲解 (一)安卓手势操作原理 (二)安卓手势类与接口 1、MotionEvent 2、GestureDetector 3、OnGestureListener (三)教学案例:利用手势切换美女图片 1、创建安卓

额外说明

Java讲课笔记21:List接口及其实现类

文章目录 零、本讲学习目标 一、集合概述 1、引入集合的必要性 2、集合的定义 3、集合的分类 (1)单列集合Collection (2)双列集合Map 4、集合体系核心结构 二、Collection接口 1、Collection接口概述 2、Colle

额外说明

asp.net和java and php 电子书的下载

asp.net 电子书的下载 java 电子书下载 php 电子书下载 

ads via 小工具