如何将字典作为参数传入实现CRUD的Database类函数执行插入查询?
用字典参数实现数据库插入操作
嘿,我懂你想要用字典作为参数完成数据库插入的需求,这能让代码更灵活,不用每次插入都硬写字段和值。我来帮你完善你的Database类,添加支持字典参数的插入方法,同时还能避免SQL注入风险。
首先看修改后的完整代码:
import pymysql as my class Database(object): def __init__(self): self.user = 'root' self.host = '127.0.0.1' self.pwd = '' self.db = 'premonition' try: self.dbs = my.connect(self.host, self.user, self.pwd, self.db) self.cursor = self.dbs.cursor() # 打印数据库版本,验证连接成功 self.cursor.execute('select version()') print(f"数据库版本: {self.cursor.fetchone()[0]}") except my.Error as error: print(f'连接数据库出错: {error}') # 连接失败时抛出异常,让调用方处理 raise def insert(self, table_name, data_dict): """ 用字典参数执行插入操作 :param table_name: 要插入的目标表名 :param data_dict: 插入的数据,键为表字段名,值为对应数据 """ if not data_dict: print("没有可插入的数据") return False try: # 从字典中提取字段名和对应值 fields = ', '.join(data_dict.keys()) # 生成与字段数量匹配的参数占位符 placeholders = ', '.join(['%s'] * len(data_dict)) # 构造动态插入SQL sql = f"INSERT INTO {table_name} ({fields}) VALUES ({placeholders})" # 执行参数化查询,杜绝SQL注入 self.cursor.execute(sql, tuple(data_dict.values())) # 提交事务 self.dbs.commit() print(f"成功插入 {self.cursor.rowcount} 条数据") return True except my.Error as error: print(f'插入数据出错: {error}') # 出错时回滚事务,保证数据一致性 self.dbs.rollback() return False finally: # 可根据需求选择是否在这里关闭游标,或在析构方法统一处理 pass def __del__(self): # 类实例销毁时自动清理数据库资源 if hasattr(self, 'cursor'): self.cursor.close() if hasattr(self, 'dbs'): self.dbs.close()
关键细节说明:
- 参数化查询:用
%s作为占位符而非直接拼接字符串,这是数据库操作的最佳实践,能有效防止SQL注入攻击。 - 动态生成SQL:从字典中自动提取字段名和值,无需硬写每个字段,适配不同表的插入需求。
- 事务处理:插入失败时执行回滚操作,避免数据出现不一致的情况。
- 资源自动清理:通过
__del__方法在类实例销毁时自动关闭连接和游标,避免资源泄漏。
使用示例:
# 创建数据库实例 db = Database() # 准备要插入的数据字典 user_data = { 'username': 'samresh', 'email': 'samresh@example.com', 'age': 28 } # 插入到user表(需确保数据库中存在该表) db.insert('user', user_data)
这样你就可以轻松把字典作为参数传入完成插入操作了。如果要扩展其他CRUD方法(比如更新、条件查询),也可以用类似思路,用字典动态生成SQL语句。
内容的提问来源于stack exchange,提问作者Samresh Kumar Jha
相关产品推荐
相关产品推荐

