使用 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.connector 或 psycopg2),并相应调整 SQL 语法和连接方式。
Q3: 如何防止 SQL 注入?
A3: 通过使用参数化查询(如 ? 占位符),可以有效防止 SQL 注入攻击。类中的 insert_data、update_data 和 execute_sql 方法均已采用这种方式。
Q4: 数据库连接没有关闭会怎样?
A4: 如果不主动关闭数据库连接,可能导致资源泄露或数据库锁问题。建议使用上下文管理器或在操作完成后调用 close() 方法。
总结
使用 Python 创建一个简单的数据库类,支持增、删、改、查操作,可以有效提升数据库交互的效率和代码的可维护性。