基于PEP 249 - Python Database API 2.0 Specification,设计一个python的ORM组件
设计一个简单的 ORM(对象关系映射)组件基于 PEP 249 规范,可以简化数据库操作,使得数据库表与 Python 类之间的映射变得更加直观。以下是一个基础 ORM 组件的实现示例:
ORM 组件设计思路
- 数据库连接管理:提供连接数据库的功能。
- 模型类:定义模型类用于映射数据库表。
- 查询功能:提供简化的查询接口。
- 增删改查:实现基本的 CRUD 操作。
代码实现
import sqlite3
from abc import ABC, abstractmethodclass Database:"""数据库连接管理类"""def __init__(self, db_name):self.connection = sqlite3.connect(db_name)self.cursor = self.connection.cursor()def commit(self):self.connection.commit()def close(self):self.connection.close()class BaseModel(ABC):"""模型基类"""@classmethod@abstractmethoddef table_name(cls):pass@classmethoddef create_table(cls, db: Database):"""创建表"""raise NotImplementedError("Subclasses must implement this method.")@classmethoddef all(cls, db: Database):"""获取所有记录"""db.cursor.execute(f"SELECT * FROM {cls.table_name()}")return db.cursor.fetchall()@classmethoddef insert(cls, db: Database, **kwargs):"""插入记录"""columns = ', '.join(kwargs.keys())placeholders = ', '.join(['?'] * len(kwargs))sql = f"INSERT INTO {cls.table_name()} ({columns}) VALUES ({placeholders})"db.cursor.execute(sql, tuple(kwargs.values()))db.commit()@classmethoddef delete(cls, db: Database, record_id):"""删除记录"""db.cursor.execute(f"DELETE FROM {cls.table_name()} WHERE id = ?", (record_id,))db.commit()class User(BaseModel):"""用户模型"""@classmethoddef table_name(cls):return "users"@classmethoddef create_table(cls, db: Database):db.cursor.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER)""")db.commit()# 使用示例if __name__ == "__main__":db = Database("example.db")# 创建表User.create_table(db)# 插入数据User.insert(db, name="Alice", age=30)User.insert(db, name="Bob", age=25)# 查询数据users = User.all(db)print("用户列表:", users)# 删除用户User.delete(db, 1) # 删除 id = 1 的用户# 查询数据users = User.all(db)print("删除后的用户列表:", users)# 清理db.close()
核心功能说明
-
Database 类:
- 管理与 SQLite 数据库的连接。
- 提供打开、提交和关闭连接的功能。
-
BaseModel 类:
- 定义了 OR/M 的基本操作,所有模型类都应继承该类。
- 包含
create_table
、all
、insert
和delete
方法。
-
User 类:
- 继承
BaseModel
,实现了用户模型。 - 提供了定义表名和创建表的功能。
- 继承
运行示例
该示例可以直接运行,会在 example.db
中创建一个 users
表,并插入数据、查询数据、删除数据。
补充功能
在实际使用中,您可能还需要添加更多功能,例如:
- 更新记录。
- 使用更复杂的查询条件。
- 更加全面的错误处理。
- 支持多种数据库(如 MySQL、PostgreSQL 等)。
本示例为基础的 ORM 实现,可在此基础上扩展以满足更复杂的需求。