088. 编写一个函数,实现简单的ORM框架

ORM(Object-Relational Mapping,对象关系映射)框架是一种将数据库中的表结构映射到对象的编程技术。在 Python 中,可以使用 sqlite3 模块来实现一个简单的 ORM 框架。以下是一个简单的 ORM 框架的实现,支持基本的数据库操作,如创建表、插入数据、查询数据等。

示例代码

以下代码实现了一个简单的 ORM 框架,支持基本的数据库操作。

import sqlite3

# 定义一个基类,用于创建表和执行数据库操作
class Model:
    db_name = 'example.db'

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

    @classmethod
    def create_table(cls):
        columns = ', '.join([f"{key} {value}" for key, value in cls.__annotations__.items()])
        create_table_sql = f"CREATE TABLE IF NOT EXISTS {cls.__name__} ({columns})"
        with sqlite3.connect(cls.db_name) as conn:
            conn.execute(create_table_sql)

    @classmethod
    def insert(cls, **kwargs):
        columns = ', '.join(kwargs.keys())
        placeholders = ', '.join(['?'] * len(kwargs))
        values = tuple(kwargs.values())
        insert_sql = f"INSERT INTO {cls.__name__} ({columns}) VALUES ({placeholders})"
        with sqlite3.connect(cls.db_name) as conn:
            conn.execute(insert_sql, values)

    @classmethod
    def select(cls, **kwargs):
        conditions = ' AND '.join([f"{key} = ?" for key in kwargs.keys()])
        values = tuple(kwargs.values())
        select_sql = f"SELECT * FROM {cls.__name__} WHERE {conditions}"
        with sqlite3.connect(cls.db_name) as conn:
            cursor = conn.execute(select_sql, values)
            rows = cursor.fetchall()
            return [cls(**dict(zip([col[0] for col in cursor.description], row))) for row in rows]

# 定义一个具体的模型类
class User(Model):
    __annotations__ = {
        'id': 'INTEGER PRIMARY KEY AUTOINCREMENT',
        'name': 'TEXT NOT NULL',
        'age': 'INTEGER NOT NULL'
    }

# 主函数
if __name__ == "__main__":
    # 创建表
    User.create_table()

    # 插入数据
    User.insert(name='Alice', age=30)
    User.insert(name='Bob', age=25)

    # 查询数据
    users = User.select(age=25)
    for user in users:
        print(f"User: {user.name}, Age: {user.age}")

代码说明

基类 Model

  • 定义了一个基类 Model,用于创建表和执行数据库操作。

  • 使用 sqlite3 模块连接到 SQLite 数据库。

  • 提供了 create_tableinsertselect 方法,分别用于创建表、插入数据和查询数据。

模型类 User

  • 定义了一个具体的模型类 User,继承自 Model

  • 使用 __annotations__ 属性定义表的列和数据类型。

创建表:使用 create_table 方法创建表,根据 __annotations__ 生成 SQL 语句。

插入数据:使用 insert 方法插入数据,生成 SQL 插入语句并执行。

查询数据

  • 使用 select 方法查询数据,生成 SQL 查询语句并执行。

  • 将查询结果映射为模型对象。

示例输出

假设运行上述代码,将创建一个 SQLite 数据库文件 example.db,并在其中创建一个 User 表。插入数据后,查询并打印结果。

注意事项

安全性:在实际应用中,需要防止 SQL 注入攻击,确保用户输入的数据经过适当的验证和清理。

功能扩展

  • 这个简单的 ORM 框架仅支持基本的数据库操作,不支持复杂查询、关联查询等功能。

  • 在实际应用中,可以扩展实现更多功能,如更新、删除、关联模型等。

数据库选择:这个实现使用了 SQLite 数据库,适用于小型项目或开发测试。对于生产环境,可以使用其他数据库(如 MySQL、PostgreSQL)。

扩展功能

如果你需要更复杂的 ORM 框架功能,可以考虑以下内容:

  1. 支持更多数据库:使用 SQLAlchemy 或其他 ORM 框架支持多种数据库。
  2. 支持复杂查询:实现更复杂的查询功能,如排序、分组、分页等。
  3. 支持关联模型:实现模型之间的关联关系,如一对一、一对多、多对多等。
  4. 支持事务管理:实现事务管理功能,确保数据库操作的原子性。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)