基于PEP 249 - Python Database API 2.0 Specification,设计一个python的ORM组件
设计一个简单的 ORM(对象关系映射)组件基于 PEP 249 规范,可以简化数据库操作,使得数据库表与 Python 类之间的映射变得更加直观。以下是一个基础 ORM 组件的实现示例:
ORM 组件设计思路
- 数据库连接管理:提供连接数据库的功能。
- 模型类:定义模型类用于映射数据库表。
- 查询功能:提供简化的查询接口。
- 增删改查:实现基本的 CRUD 操作。
代码实现
import sqlite3
from abc import ABC, abstractmethod
class 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
@abstractmethod
def table_name(cls):
pass
@classmethod
def create_table(cls, db: Database):
"""创建表"""
raise NotImplementedError("Subclasses must implement this method.")
@classmethod
def all(cls, db: Database):
"""获取所有记录"""
db.cursor.execute(f"SELECT * FROM {cls.table_name()}")
return db.cursor.fetchall()
@classmethod
def 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()
@classmethod
def delete(cls, db: Database, record_id):
"""删除记录"""
db.cursor.execute(f"DELETE FROM {cls.table_name()} WHERE id = ?", (record_id,))
db.commit()
class User(BaseModel):
"""用户模型"""
@classmethod
def table_name(cls):
return "users"
@classmethod
def 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 实现,可在此基础上扩展以满足更复杂的需求。