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_table
、insert
和select
方法,分别用于创建表、插入数据和查询数据。
模型类 User
:
-
定义了一个具体的模型类
User
,继承自Model
。 -
使用
__annotations__
属性定义表的列和数据类型。
创建表:使用 create_table
方法创建表,根据 __annotations__
生成 SQL 语句。
插入数据:使用 insert
方法插入数据,生成 SQL 插入语句并执行。
查询数据:
-
使用
select
方法查询数据,生成 SQL 查询语句并执行。 -
将查询结果映射为模型对象。
示例输出
假设运行上述代码,将创建一个 SQLite 数据库文件 example.db
,并在其中创建一个 User
表。插入数据后,查询并打印结果。
注意事项
安全性:在实际应用中,需要防止 SQL 注入攻击,确保用户输入的数据经过适当的验证和清理。
功能扩展:
-
这个简单的 ORM 框架仅支持基本的数据库操作,不支持复杂查询、关联查询等功能。
-
在实际应用中,可以扩展实现更多功能,如更新、删除、关联模型等。
数据库选择:这个实现使用了 SQLite 数据库,适用于小型项目或开发测试。对于生产环境,可以使用其他数据库(如 MySQL、PostgreSQL)。
扩展功能
如果你需要更复杂的 ORM 框架功能,可以考虑以下内容:
- 支持更多数据库:使用
SQLAlchemy
或其他 ORM 框架支持多种数据库。 - 支持复杂查询:实现更复杂的查询功能,如排序、分组、分页等。
- 支持关联模型:实现模型之间的关联关系,如一对一、一对多、多对多等。
- 支持事务管理:实现事务管理功能,确保数据库操作的原子性。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)