ORM-像对象一样对待数据

2024-02-25 13:40
文章标签 数据 对象 orm 对待

本文主要是介绍ORM-像对象一样对待数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

咱们编程教室有不少同学,学完了基础课程,掌握了一定的编程能力,开始做项目了。然后很可能遇到一个问题:管理数据。课程里有讲过用文件保存数据,还有 picklecsv 等模块辅助。但对于稍微复杂一点的数据,往往不够方便。成熟的解决方案就是使用数据库

估计每个刚刚使用数据库的人都会被坑得遍体鳞伤。对于一个刚刚学会 Python 不久的开发新手来说,使用数据库的 SQL 语句几乎相当于再学一种新的语言。虽然 sqlitepymysql 等模块提供了与数据的连接,但仍然需要自己去拼接 SQL 语句。Python 语法和 SQL 语法、各种引号、百分号、转义字符混杂在一起的酸爽,用过的人都忘不了。

所以实际开发中,如无特殊需求,一般不会直接写 SQL,而是用更为方便的 ORM(对象关系映射,Object Relational Mapping)。顾名思义,就是将关系型数据库与 Python 中的对象关联起来,提供了一种操作数据的简便方式,相当于对数据库加了一层更友好的接口。

目前 Python 中比较流行的 ORM 解决方案有三种:

  1. Django ORM。使用方便,但很难脱离 Django 单独使用。
  2. SQLAlchemy。功能强大,成熟可扩展,但学习门槛较高。
  3. peewee。轻量,可扩展,易学习,但功能有限。

对于偏初级的小型项目,通常用不到很复杂的功能,这时候 peewee 或许是最好的选择。今天我们就来重点介绍下 peewee 这个 Python ORM 库。

> 安装

pip install peewee

> 连接数据库

以 SQLite 为例:

import peewee
db = peewee.SqliteDatabase('people.db')
db.connect()

people.db 是 SQLite 的数据库文件,如果不存在会自己新建。

如果是 MySQL,要稍微复杂点,需再提供地址、用户名、密码等信息,并且必须先手动建好库:

db = peewee.MySQLDatabase('people', host='127.0.0.1', user='root', passwd='', charset='utf8', port=3306)

特别要记住的一点是,代码进行完所有数据库操作后,要主动关闭数据库:

db.close()

> 创建数据类型

既然是与对象关联,自然需要以面向对象的方式定义数据结构。我们假定一个表示人的类型 Person,包含姓名 name 和生日 birthday 两个字段:

class Person(peewee.Model):class Meta:database = dbname = peewee.CharField()birthday = peewee.DateField()Person.create_table()

如果是用过 Django 的同学,对这个 Model 应该非常熟悉了。要注意的就是,需要在 Meta 里定义 database 为前面创建的数据库。然后使用相应的 Field 类型定义字段即可。

> 新增数据对象

from datetime import date
# 方法1
uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15))
uncle_bob.save()
# 方法2
Person.create(name='Crossin', birthday=date(1985, 5, 5))

直接创建数据对象,需要调用 save 方法保存到数据库中。而使用 create 方法创建则不用。

> 查找数据对象

bob = Person.get(Person.name == 'Bob')
print(bob.name, bob.birthday)
# 获取所有数据
for person in Person.select():print(person.name)

注意这里的查找条件写法,这与 Django 是不同的。查找还可以用 where 语句,这里不做演示,可以参考官方文档。

> 修改数据对象

对于上一步找到的 bob 变量:

bob.name = 'Robert'
bob.save()

直接向属性赋值,修改完记得要 save

> 删除数据对象

bob.delete_instance()

顺便说句,一般不建议在数据库里删除数据,因为数据删了就不好找回来了,而且可能还会引发关联数据的报错。通常是增加一个 is_deleted 字段标记已删除的内容。(所以,不要以为在网上把发布过的内容删掉就真的不存在了)

> 创建关联数据

在程序中,经常会有一些具有关联关系的数据。比如我们再创建一个宠物类 Pet,每个宠物有名字 name 和主人 owner。owner 对应的就是我们前面创建的 Person 类:

class Pet(peewee.Model):class Meta:database = dbowner = peewee.ForeignKeyField(Person, backref='pets')name = peewee.CharField()

这样一来,我们就可以很方便的通过宠物找到它的主人:

bob_kitty = Pet.create(owner=bob, name='Kitty')
bob_fido = Pet.create(owner=bob, name='Fido')
print(bob_kitty.owner.name)

也可以找到一个人养的所有宠物:

for pet in bob.pets:print(pet.name)

以上就是 peewee 的基本操作,如果你了解面向对象,应该不难理解。这些例子取自其官方文档的快速上手 Quickstart。虽然没有像 Requests 那样贴心地提供中文版,但也同样足够人性化。

地址:docs.peewee-orm.com/en/

> 自动生成代码

peewee 提供了一个功能,可以从已有的数据库反向生成数据模型代码。以 SQLite 为例:

python -m pwiz -e sqlite people.db > db.py

在你的数据库文件所在路径下执行这条命令,就可以在 db.py 中自动生成代码。

自动生成的代码

在本专栏先前的案例中,有一些就使用了 peewee。比如 Python 高频词汇表(关键字:单词)和押韵检索工具(关键字:押韵)。在本公众号(Crossin的编程教室)里回复相应关键字可查看文章及代码。

最后提一下,除了使用 ORM 外,对于数据存储还有一种解决方案,就是使用非关系型数据库,比如 mongodb。尽管坑也不少,但对于简单的数据存储来说,它有个巨大的优势就是同 Python 内置的 dict、list 等类型兼容良好,可以直接存取,让你甚至感觉不到有数据库的存在,也根本无需关心 SQL 语句。爬虫实战课程中的部分案例,就选择了 mongodb 作为数据存储方案。



════
其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 区块链 | 人工智能 | 双11 | 嘻哈 | 爬虫 | 排序算法 | 我用Python | 高考 | 世界杯 | requests

欢迎搜索及关注:Crossin的编程教室

这篇关于ORM-像对象一样对待数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/745654

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解