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

2024-01-02 07:45:40

2e616a87f03b2eec67e7f049d7c8ff3d.jpeg

更多Python学习内容:ipengtao.com

对象关系映射(Object-Relational Mapping,ORM)是一种将对象模型与关系数据库之间的数据映射的技术,可以使用面向对象的方式操作数据库,而不必关心底层的 SQL 操作。在 Python 中,可以借助元类(metaclass)编写一个简单的 ORM,实现对象与数据库表之间的映射。本文将介绍如何使用 Python 的元类来实现这一目标,并提供详细的示例代码。

ORM 的基本概念

在开始编写 ORM 之前,先了解一下 ORM 的基本概念和工作原理。

数据库表和类的映射

ORM 的核心思想是将数据库表映射为类,将表中的每一行数据映射为类的一个对象。每个对象代表数据库表中的一条记录,对象的属性对应表中的字段。

数据库操作的面向对象方式

使用 ORM,可以使用面向对象的方式进行数据库操作,例如创建、读取、更新和删除记录。这样,可以摆脱编写复杂的 SQL 语句,而是使用 Python 类和方法来进行数据库操作。

ORM 的优点

使用 ORM 有以下优点:

  • 抽象数据库操作:ORM 可以抽象数据库操作,使开发者专注于业务逻辑,而不必深入研究 SQL。

  • 提高代码可维护性:通过使用 Python 类来表示数据库表,代码更具可读性和可维护性。

  • 跨数据库兼容:ORM 可以在不同类型的数据库之间切换,而不必更改大量的代码。

利用元类创建 ORM 框架

元类是 Python 中高级的概念,它可以在类定义的时候定制类的行为。为了创建一个简单的 ORM 框架,使用元类来自动创建映射类。

步骤 1:定义元类

首先,需要定义一个元类,让它负责创建映射类。这个元类需要继承自 type 类,并重写 __new__ 方法。

class?ORMBase(type):
????def?__new__(cls,?name,?bases,?attrs):
????????#?创建映射类的代码将在这里编写
????????return?super().__new__(cls,?name,?bases,?attrs)

步骤 2:创建映射类

接下来,可以创建一个基类,它使用定义的元类。这个基类将负责创建映射类,并提供一些常用的数据库操作方法,例如保存、查询和删除记录。

class?ORMModel(metaclass=ORMBase):
????def?__init__(self,?**kwargs):
????????for?key,?value?in?kwargs.items():
????????????setattr(self,?key,?value)

????def?save(self):
????????#?保存记录的代码将在这里编写
????????pass

????@classmethod
????def?get(cls,?**kwargs):
????????#?查询记录的代码将在这里编写
????????pass

????def?delete(self):
????????#?删除记录的代码将在这里编写
????????pass

步骤 3:创建映射类

现在,可以创建实际的映射类,每个映射类对应数据库中的一个表。只需定义类的属性,ORM 框架将负责创建数据库表。

class?User(ORMModel):
????username?=?str
????age?=?int

步骤 4:实现数据库操作

最后,需要在映射类中实现具体的数据库操作。这包括保存、查询和删除记录的方法。可以使用数据库库(例如 SQLite 或 SQLAlchemy)来执行这些操作。

import?sqlite3

class?User(ORMModel):
????username?=?str
????age?=?int

????def?save(self):
????????#?连接数据库
????????conn?=?sqlite3.connect('mydb.db')
????????cursor?=?conn.cursor()

????????#?创建表
????????cursor.execute('''CREATE?TABLE?IF?NOT?EXISTS?User
??????????????????????????(id?INTEGER?PRIMARY?KEY?AUTOINCREMENT,
???????????????????????????username?TEXT,
???????????????????????????age?INTEGER)''')

????????#?插入记录
????????cursor.execute("INSERT?INTO?User?(username,?age)?VALUES?(?,??)",
???????????????????????(self.username,?self.age))

????????#?提交事务并关闭连接
????????conn.commit()
????????conn.close()

????@classmethod
????def?get(cls,?**kwargs):
????????#?连接数据库
????????conn?=?sqlite3.connect('mydb.db')
????????cursor?=?conn.cursor()

????????#?构造查询条件
????????conditions?=?[]
????????values?=?[]

????????for?key,?value?in?kwargs.items():
????????????conditions.append(f"{key}?=??")
????????????values.append(value)

????????condition_str?=?'?AND?'.join(conditions)

????????#?查询记录
????????cursor.execute(f"SELECT?*?FROM?User?WHERE?{condition_str}",?tuple(values))
????????rows?=?cursor.fetchall()

????????#?将查询结果转换为对象
????????result?=?[]

????????for?row?in?rows:
????????????user?=?cls()
????????????user.id?=?row[0]
????????????user.username?=?row[1]
????????????user.age?=?row[2]
????????????result.append(user)

????????#?关闭连接
????????conn.close()

????????return?result

????def?delete(self):
????????#?连接数据库
????????conn?=?sqlite3.connect('mydb.db')
????????cursor?=?conn.cursor()

????????#?删除记录
????????cursor.execute("DELETE?FROM?User?WHERE?id?=??",?(self.id,))

????????#?提交事务并关闭连接
????????conn.commit()
????????conn.close()

使用我们的 ORM 框架

现在,可以使用 ORM 框架来创建、保存、查询和删除记录。以下是一些示例代码:

创建记录

user?=?User(username='Alice',?age=25)
user.save()

查询记录

users?=?User.get(username='Alice')
for?user?in?users:
????print(f"ID:?{user.id},?Username:?{user.username},?Age:?{user.age}")

删除记录

user?=?User.get(username='Alice')[0]
user.delete()

总结

通过使用 Python 的元类,可以编写一个简单的 ORM 框架,使得数据库操作更具面向对象的特性。虽然本文中的 ORM 框架非常简单,但它展示了 ORM 技术的基本概念和实现方式。在实际项目中,可以使用成熟的 ORM 库,如 SQLAlchemy,来简化数据库操作,并提高生产力。希望本文能帮助大家理解 ORM 的基本原理和 Python 中元类的使用。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

? 100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

fbbe40efcb39535e0fbdfcf111f57764.png

点击“阅读原文”,获取更多学习内容

文章来源:https://blog.csdn.net/wuShiJingZuo/article/details/135331854
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。