You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字典作为参数传入实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:26:19