使用 Python 创建一个简单的数据库类,支持增、删、改、查操作(实战总结)

使用 Python 创建一个简单的数据库类,支持增、删、改、查操作

快速解决

使用 Python 创建一个简单的数据库类,支持增、删、改、查操作,可以通过面向对象编程的方式封装数据库连接与常用 SQL 语句。以下是一个基于 SQLite 的简单数据库类示例,能够快速完成基础数据操作:

import sqlite3

class SimpleDatabase:
    def __init__(self, db_name):
        self.conn = sqlite3.connect(db_name)
        self.cursor = self.conn.cursor()

    def create_table(self, table_sql):
        self.cursor.execute(table_sql)
        self.conn.commit()

    def insert_data(self, table, data):
        columns = ', '.join(data.keys())
        placeholders = ', '.join('?' * len(data))
        sql = f"INSERT INTO {table} ({columns}) VALUES ({placeholders})"
        self.cursor.execute(sql, list(data.values()))
        self.conn.commit()

    def select_data(self, table, condition=None):
        if condition:
            sql = f"SELECT * FROM {table} WHERE {condition}"
        else:
            sql = f"SELECT * FROM {table}"
        self.cursor.execute(sql)
        return self.cursor.fetchall()

    def update_data(self, table, set_values, condition):
        set_clause = ', '.join([f"{k} = ?" for k in set_values.keys()])
        sql = f"UPDATE {table} SET {set_clause} WHERE {condition}"
        self.cursor.execute(sql, list(set_values.values()))
        self.conn.commit()

    def delete_data(self, table, condition):
        sql = f"DELETE FROM {table} WHERE {condition}"
        self.cursor.execute(sql)
        self.conn.commit()

    def close(self):
        self.conn.close()

该类可直接用于 SQLite 数据库操作,无需依赖第三方库,适合小型项目或快速原型开发。

常用方法

方法名 功能说明 使用频率 参数说明
__init__ 初始化数据库连接 数据库文件名
create_table 创建数据库表 SQL 语句
insert_data 插入数据行 表名、数据字典
select_data 查询数据 表名、查询条件(可选)
update_data 更新数据 表名、更新字段字典、条件语句
delete_data 删除数据 表名、删除条件
close 关闭数据库连接 无参数

详细说明

初始化数据库连接

import sqlite3

class SimpleDatabase:
    def __init__(self, db_name):
        self.conn = sqlite3.connect(db_name)  # 建立 SQLite 数据库连接
        self.cursor = self.conn.cursor()      # 创建游标,用于执行 SQL

__init__ 方法用于初始化数据库连接,传入数据库文件名即可。如果文件不存在,SQLite 会自动创建一个。

创建数据库表

    def create_table(self, table_sql):
        self.cursor.execute(table_sql)        # 执行传入的建表 SQL 语句
        self.conn.commit()                    # 提交事务,使表创建生效

通过传入 SQL 语句,可以灵活地创建各种表结构。例如,以下语句可以创建一个用户表:

db = SimpleDatabase('example.db')
table_sql = """
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT
    )
"""
db.create_table(table_sql)

插入数据

    def insert_data(self, table, data):
        columns = ', '.join(data.keys())                # 提取字典中的字段名
        placeholders = ', '.join('?' * len(data))       # 生成占位符如 ?, ?, ?
        sql = f"INSERT INTO {table} ({columns}) VALUES ({placeholders})"
        self.cursor.execute(sql, list(data.values()))   # 插入数据
        self.conn.commit()                              # 提交插入操作

使用字典形式传入字段与值,可避免手动拼接 SQL,提升代码可读性。例如:

data = {'name': '张三', 'age': 25, 'email': 'zhangsan@example.com'}
db.insert_data('users', data)

查询数据

    def select_data(self, table, condition=None):
        if condition:
            sql = f"SELECT * FROM {table} WHERE {condition}"  # 带条件查询
        else:
            sql = f"SELECT * FROM {table}"                      # 查询所有数据
        self.cursor.execute(sql)                                # 执行 SQL
        return self.cursor.fetchall()                           # 获取查询结果

该方法可以查询所有数据或根据条件筛选。例如:

results = db.select_data('users', "age > 20")
for row in results:
    print(row)  # 输出符合条件的用户数据

更新数据

    def update_data(self, table, set_values, condition):
        set_clause = ', '.join([f"{k} = ?" for k in set_values.keys()])  # 构建 SET 子句
        sql = f"UPDATE {table} SET {set_clause} WHERE {condition}"
        self.cursor.execute(sql, list(set_values.values()))             # 执行更新语句
        self.conn.commit()

更新操作需要指定字段和值,以及更新的条件。例如:

update_data = {'age': 26}
db.update_data('users', update_data, "name = '张三'")

删除数据

    def delete_data(self, table, condition):
        sql = f"DELETE FROM {table} WHERE {condition}"
        self.cursor.execute(sql)
        self.conn.commit()

删除操作通过条件筛选要删除的行。例如:

db.delete_data('users', "name = '张三'")

高级技巧

1. 使用上下文管理器自动关闭连接

在实际开发中,手动调用 close() 容易忘记,可以使用 __enter____exit__ 方法实现上下文管理:

class SimpleDatabase:
    def __init__(self, db_name):
        self.db_name = db_name

    def __enter__(self):
        self.conn = sqlite3.connect(self.db_name)
        self.cursor = self.conn.cursor()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cursor.close()
        self.conn.close()

使用方式如下:

with SimpleDatabase('example.db') as db:
    table_sql = """
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            age INTEGER,
            email TEXT
        )
    """
    db.create_table(table_sql)

2. 支持批量插入

在处理大量数据时,逐条插入效率较低,可以使用 executemany 批量插入:

    def batch_insert(self, table, data_list):
        columns = ', '.join(data_list[0].keys())
        placeholders = ', '.join('?' * len(data_list[0]))
        sql = f"INSERT INTO {table} ({columns}) VALUES ({placeholders})"
        self.cursor.executemany(sql, [list(data.values()) for data in data_list])
        self.conn.commit()

使用示例:

users = [
    {'name': '李四', 'age': 30, 'email': 'lisi@example.com'},
    {'name': '王五', 'age': 28, 'email': 'wangwu@example.com'}
]
db.batch_insert('users', users)

3. 支持自定义 SQL 查询

对于复杂查询,可以提供一个方法供用户传入完整的 SQL 语句:

    def execute_sql(self, sql, params=None):
        if params:
            self.cursor.execute(sql, params)
        else:
            self.cursor.execute(sql)
        return self.cursor.fetchall()

使用方式如下:

sql = "SELECT name, email FROM users WHERE age < ?"
params = (30,)
results = db.execute_sql(sql, params)
print(results)

常见问题

Q1: 如何确保插入操作的字段顺序正确?

A1: 通过使用字典结构传入字段与值,字段的顺序由字典的 keys 决定。Python 3.7+ 中字典是有序的,因此字段顺序将与插入时一致。

Q2: 使用这个类是否支持其他数据库(如 MySQL、PostgreSQL)?

A2: 该类是基于 SQLite 的实现。要支持其他数据库,需要替换 sqlite3 模块为对应的数据库驱动(如 mysql.connectorpsycopg2),并相应调整 SQL 语法和连接方式。

Q3: 如何防止 SQL 注入?

A3: 通过使用参数化查询(如 ? 占位符),可以有效防止 SQL 注入攻击。类中的 insert_dataupdate_dataexecute_sql 方法均已采用这种方式。

Q4: 数据库连接没有关闭会怎样?

A4: 如果不主动关闭数据库连接,可能导致资源泄露或数据库锁问题。建议使用上下文管理器或在操作完成后调用 close() 方法。

总结

使用 Python 创建一个简单的数据库类,支持增、删、改、查操作,可以有效提升数据库交互的效率和代码的可维护性。