python自定义ORM并操作数据库

Python轻量级ORM框架Peewee访问sqlite数据库的方法详解 本文实例讲述了Python轻量级ORM框架Peewee访问sqlite数据库的方法。分享给大家供大家参考,具体如下: ORM框架就是 object relation model,对象关系模型,用来实现把数据库中的表 映射到 面向对象编程语言中的类,不需要写sql,通过操作对象就能实现 增删改查。 ORM的基本技术有3种: (1)映射技术 数据类型映射:就是把数据库中的数据类型,映射到编程语言中的数据类型。比如,把数据库的int类型映射到Python中的integer 类型。 类映射:把数据库中的表,映射到面向对象编程语言的类,这样就不用写sql,直接操作对象就可以了。 关系映射:关系型数据库最 立即下载

看这个代码之前先去看上篇文章,理解type的用法及元类的含义:

ORM可以代替pymysql,实现将python语义装换为sql语句,简单化

    import pymysql
    '''
    metaclass,直译为元类,简单的解释就是:
    
    当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。
    
    但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。
    
    连接起来就是:先定义metaclass,就可以创建类,最后创建实例。
    
    所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。
    
    当我们传入关键字参数metaclass时,魔术就生效了,它指示Python解释器在创建Student时,
    
    要通过ModelMetaClass.__new__()来创建,在此,我们可以修改类的定义,比如,加上新的方法,然后,返回修改后的定义。
    '''
    class Field(object):#定义一个字段类
        def __init__(self,name,column_type):
            self.name = name#字段名
            self.column_type = column_type#字段类型
        def __str__(self):
            return "<%s:%s>"%(self.name,self.column_type)
    
    class StringField(Field):#字符串类型字段,继承Field
        def __init__(self,name):
            super(StringField,self).__init__(name,"varchar(100)")
            # super(StringField, self).__init__(name,char(20))
    
    class IntegerField(Field):#数字类型字段,继承Field
        def __init__(self,name):
            super(IntegerField,self).__init__(name,"int")
    
    class ModelMetaClass(type):#定义一个元类
        def __new__(cls, name,bases,attrs):
            '''
            :param name: 类的名称
            :param bases: 类的继承
            :param attrs:  类的属性
            :return:
            '''
            if name == "Model":#如果传入的name:类名为Model则不进行操作,直接返回type类的相关参数
                return type.__new__(cls,name,bases,attrs)
                # return super(ModelMetaClass, self).__new__(cls,name,bases,attrs)
            print('Found model: %s' % name)  # 打印当前实例的类名称
            mapping = dict() #空字典
            for k,v in attrs.items(): #遍历属性
                print('key:%s,value:%s' % (k, v))#打印遍历attrs的key和value
                if isinstance(v,Field): #判断属性是否Field的实例
                    mapping[k] = v #添加到mapping当中
            # print(mapping)
            for k in mapping.keys(): #返回所有键
                attrs.pop(k) #mapping里存在的内容从属性当中删除
            attrs["__mapping__"] = mapping  #设定__mapping__属性来保存字段
            attrs["__table__"] = name #设定类名和表名一致(不区分大小写)
            # print(attrs)
            return type.__new__(cls,name,bases,attrs)#返回给类实例,这里为Student
    
    class Model(dict,metaclass = ModelMetaClass):#创建一个实例类,设置其元类
        def __init__(self,**kwargs):
            self.db = pymysql.connect(#链接数据库
                host = "localhost",
                user = "root",
                password = "123",
                database = "test"
            )
            self.cursor = self.db.cursor()
            super(Model,self).__init__(**kwargs)
    
        def __getattr__(self, key):
            return self[key]#返回对象的属性值
            # print(self[key])
        def __setattr__(self, key, value):
            self[key] = value#设置对象的属性及其对应的值
    
    
        def save(self):
            fields = [] #空列表用来存储字段
            args = [] #空列表用来存储字段的值
            for k,v in self.__mapping__.items():
                fields.append(v.name)#此时,v为field子类的实例,因此可以取出类属性name,作为字段名
                # print(getattr(self, k, None))
                args.append(getattr(self,k,None))#此时调用了self,则将传入的参数调用,此时再取变量的值,则为传入的实参
            sql = "insert into %s(%s) values (%s)"%(
                self.__table__,
                ",".join(fields),
                ",".join([repr(str(i)) for i in args]
                   )) #sql拼接
            self.cursor.execute(sql)
            print(sql)
        def __del__(self):
            '''
            回收内存
            '''
            self.db.commit()
            self.cursor.close()
            self.db.close()
    
    class Student(Model):#model实例类的子类
        name = StringField("name")
        # print(name)
        room_id = IntegerField("room_id")
        # print(room_id)
    
    u = Student(name = "张3",room_id = 6)#实质是创建了一个字典的对象
    u.save()#调用父类的save方法
AI + 药物临床试验研发赛道 研究日期:2026-07-09 | 研究主题:AI + 药物临床试验研发赛道 | 聚焦岗位:Agent 平台架构师 / AI 工程架构师。 阅读详情

相关推荐

新手必看:用Simulink搭建飞跨电容三电平逆变器的完整流程(附SPWM配置技巧)

本文详细介绍了使用Simulink搭建飞跨电容三电平逆变器(FCNPC)的完整流程,特别聚焦于SPWM调制策略的配置技巧。通过模块拆解、参数设置和波形优化的三步法,配合实操截图和典型参数表,帮助新手快速掌握多电平逆变器的建模与仿真技能,适用于电力电子学习和项目开发。

weixin_30664051的博客 285

箱线图进阶:用Matplotlib识别异常值的3种实用技巧(2023最新版)

本文详细介绍了2023年最新版Matplotlib箱线图在异常值检测中的3种实用技巧,包括IQR系数的动态调整、离群点可视化增强和多维度对比分析。通过代码示例和参数建议,帮助数据分析师更精准地识别和处理异常值,提升数据清洗效率。

weixin_33712987的博客 244

电流镜设计实战:从基础到高级技巧(附常见问题解决方案)

本文从工程实战角度,系统讲解了电流镜设计从基础原理到高级技巧的全过程。深入剖析了匹配精度、输出阻抗等核心矛盾,并详细介绍了共源共栅(Cascode)结构如何平衡电压裕度与输出阻抗。文章还重点探讨了工艺偏差、版图应力效应等实战中的“隐形杀手”,并提供了常见问题的解决方案与调试技巧,旨在帮助工程师设计出鲁棒性更强的模拟电路。

blockchain9miner的博客 731

自定义ORM:Python元类教程带你实现轻松数据库操作!

首先,需要定义一个元类,让它负责创建映射类。这个元类需要继承自type类,并重写__new__方法。# 创建映射类的代码将在这里编写通过使用 Python 的元类,可以编写一个简单的 ORM 框架,使得数据库操作更具面向对象的特性。虽然本文中的 ORM 框架非常简单,但它展示了 ORM 技术的基本概念和实现方式。在实际项目中,可以使用成熟的 ORM 库,如 SQLAlchemy,来简化数据库操作,并提高生产力。希望本文能帮助大家理解 ORM 的基本原理和 Python 中元类的使用。

涛哥聊Python 1721

HPC软件使用之ANSYS Fluent

本文介绍了如何在超级计算机上使用ANSYS Fluent进行科学计算和工程仿真。文章首先对Fluent软件进行了简要介绍,强调了其在计算流体力学领域的广泛应用和强大功能。接着,详细说明了如何编写jou脚本文件和slurm脚本文件,以控制Fluent的计算流程和作业提交。文章还提供了作业提交和查看的具体命令,并通过一个鼓风机仿真的案例演示了从网格模型准备、脚本编写、作业提交到结果查看的完整流程。最后,展示了使用Fluent进行结果可视化的方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 2210

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 854

python sqlite进行ORM

通过以上示例,我们展示了如何使用 Python 和 SQLite 实现一个简单的 ORM 系统。这个系统能够有效地管理用户信息和他们的订单。在实际项目中,您可能还需要处理更复杂的业务逻辑,如数据验证、事务处理以及错误处理等。

Lucas在澳洲 1530

C51单片机驱动ILI9341彩屏实战:从Proteus仿真到绘制自定义图案(附完整代码)

本文详细介绍了使用C51单片机驱动ILI9341彩屏的完整实战流程。内容涵盖硬件连接、8080并行接口时序模拟、寄存器初始化、屏幕方向设置以及基本图形绘制原理,并重点讲解了如何在Proteus仿真环境中搭建电路、调试代码,最终实现自定义图案的显示。文章提供了完整的代码示例,为嵌入式开发学习者和复古硬件爱好者提供了一套可行的解决方案。

rnn9storyteller的博客 511

pythonsqlite3教程_Python3+SQLAlchemy+Sqlite3实现ORM教程

一、安装Sqlite3是Python3标准库不需要另外安装,只需要安装SQLAlchemy即可。本文sqlalchemy版本为1.3.13pip install sqlalchemy二、ORM操作除了第一步创建引擎时连接URL不一样,其他操作其他mysql等数据库和sqlite都是差不多的。2.1 创建数据库连接格式说明sqlite创建数据库连接就是创建数据库,而其他mysql等应该是需要数据库已...

weixin_39787397的博客 442

SPICE仿真软件:HSPICE_(22).HSPICE仿真案例分析

通过上述案例分析,我们可以看到HSPICE仿真软件在不同电路类型和仿真场景中的应用。无论是简单的直流分析、交流分析还是复杂的暂态分析,HSPICE都能提供详细的仿真结果,帮助我们更好地理解和优化电路设计。希望这些案例能够为读者提供实用的参考和指导,进一步提升使用HSPICE进行电路仿真的能力。输入文件的编写:确保输入文件格式正确,使用注释来解释每一部分的内容。分析类型的选择:根据电路的特点选择合适的分析类型,如.DC.AC和.TRAN。输出结果的设置:使用.print命令来指定需要输出的节点电压和支路电流。

kkchenjj的博客 1309

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(2)- 核心控制消息;会话管理;测距会话管理

测距是UWB最核心的应用。为了方便应用调用测距接口,FIRA统一了UCI命令格式,这样各个厂商可以互相兼容。

Ankie资深技术项目经理 1277

pythonormsqlite3_Python3+SQLAlchemy+Sqlite3实现ORM教程

一、安装Sqlite3是Python3标准库不需要另外安装,只需要安装SQLAlchemy即可。本文sqlalchemy版本为1.2.12pip install sqlalchemy二、ORM操作除了第一步创建引擎时连接URL不一样,其他操作其他mysql等数据库和sqlite都是差不多的。2.1 创建数据库连接格式说明sqlite创建数据库连接就是创建数据库,而其他mysql等应该是需要数据库已...

weixin_39611546的博客 374

如何使用Python爬取并保存网页上的所有附件

爬虫(Crawler)是一种自动化程序,它通过模拟人工访问网页并下载网页上的数据或文件,常用于数据采集和分析。爬虫通常以“爬取”的形式自动浏览和提取网页中的各种信息。本文详细介绍了如何使用Python爬取并保存网页中的附件文件,涵盖了网页解析、文件下载、多线程与异步优化等内容。希望通过本文的讲解,能够帮助你理解并掌握附件爬取的技巧。在实际应用中,爬虫开发不仅需要解决技术问题,还要遵守网络道德和法律法规,避免不当使用爬虫造成负面影响。

2201_76125261的博客 967

python数据库操作orm_python自定义ORM并操作数据库

import pymysql'''metaclass,直译为元类,简单的解释就是:当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。连接起来就是:先定义metaclass,就可以创建类,最后创建实例。所以,metaclass允许你创建类或者修改类。换句话说,你可...

weixin_39523529的博客 189

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

python sanic orm_sanic中使用tortoise-orm

#models.pyfrom tortoise.models import Modelfrom tortoise import fieldsclass User(Model):id = fields.IntField(pk=True, , source_field="userID")name = fields.CharField(max_length = 100)date_field = fiel...

weixin_29705519的博客 1493

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

封装的python mysql操作ORM类

这段时间写项目用了python的mysql模块,觉得sqlalchemy太庞大就自己封装了一个简单的基于mysql-python的ORM文件。功能目前刚好够用以后会慢慢完善。这个操作类中解决了python编码和入mysql库编码不统一的问题,同时还解决了mysql的反斜杠'\'会被转义丢弃的问题。 1、安装mysql-python模块 python的mysql操作需要安装mysql-pytho...

weixin_34210740的博客 219

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Django ORM自定义排序的实用示例

有时候,内置的排序功能可能无法满足我们的需求。例如,假设我们希望根据某个计算得出的值进行排序,或者根据某个复杂的条件来排序。这时候,我们可以使用Django的annotate()和F()表达式。假设我们有一个Product模型,里面有price和discount字段。我们想要根据实际价格(即价格减去折扣)进行排序。可以使用annotate()在这个例子中,是一个动态生成的字段,表示折扣后的价格。通过这种方式,我们就可以根据计算出的值进行排序了。

分享AI大模型相关前沿技术、最新人工智能资讯 898

Django ORM 数据库表的多对多操作

多对多: 创建多对多: 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressFie...

淮南草的博客 481

Python ORM封装

import sys import asyncio import logging logging.basicConfig(level=logging.INFO) # 一次使用异步 处处使用异步 import aiomysql def log(sql,args=()): logging.info('SQL:%s' %sql) @asyncio.cor...

weixin_30879169的博客 306

SQLAlchemy -- Python的ORM驱动

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33905756的博客 278

Python import的规则,Django通过ORM建立数据库的映射以及crud

关于import的路径问题 语法:from .file(文件名) import class(类名),或者直接import .file.class 1.同级模块,即要导入同级目录下另一文件file1中的类名时,上述语法均可(from .file1 import *) 2.需导入的类所在的文件在下一级目录,即下级文件夹a1,文件名class1,须导入的类class2 测试语句 3.导入上级目录,需要用到sys类库设置当前路径为上级路径 总结:要注意 . 为当前目录 imp...

Mr_Joer的博客 1449

python安装orm_Python流行ORM框架sqlalchemy安装与使用教程

本文实例讲述了Python流行ORM框架sqlalchemy安装与使用。分享给大家供大家参考,具体如下:安装1、安装#进入虚拟环境#执行./python3 -m pip installimport sqlalchemyprint(sqlalchemy.__version__) # 1.1.15我这里使用的版本是1.1.15创建连接对象from sqlalchemy import create_en...

weixin_31482671的博客 149

python:改良廖雪峰的使用元类自定义ORM

概要 本文仅仅是对廖雪峰老师的使用元类自定义ORM进行改进,并不是要创建一个ORM框架 编写field class Field(object): def __init__(self, column_type,max_length,**kwargs): ''' 1,删除了参数name,field参数...

weixin_33842304的博客 174

python常用库之数据库orm框架之SQLAlchemy

SQLAlchemy是一个基于Python实现的SQL工具包和ORM框架,提供了高层抽象来管理数据库交互。

西京刀客 2万+

【Tortoise-ORM】 基础与数据库操作

ORM(Object-Relational Mapping)是一种用于将对象模型与关系型数据库表格之间进行映射的技术。简单来说,ORM 允许开发者以面向对象的方式操作数据库,而不必直接编写 SQL 查询语句。传统的关系型数据库(如 MySQL、PostgreSQL)使用表格来存储数据,而对象导向编程语言(如 Python)使用对象来表示数据。ORM 通过创建数据库表与类之间的映射关系,简化了数据存取的操作,并在底层自动生成 SQL 语句,从而提高开发效率,减少了开发者与数据库的直接交互。

卜及中的博客 5365
上一篇: python 元类理解
下一篇: python ORM模块sqlalchemy的使用
孜孜孜孜不倦
博客等级 码龄7年 1803粉丝 277原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值