Python 任意字典生成 SQL(insert 语句)

本文介绍如何使用Python动态生成SQL插入语句,通过列表推导式和repr函数实现对字典数据的有效处理,适用于爬虫等场景下批量数据写入数据库的需求。

1、示例

1.1、完整代码

tb = 'student'
dt = {'name': 'ArYe', 'age': 15, 'height': None}
ls = [(k, v) for k, v in dt.items() if v is not None]
sentence = 'INSERT %s (' % tb + ','.join([i[0] for i in ls]) +\
           ') VALUES (' + ','.join(repr(i[1]) for i in ls) + ');'
print(sentence)
打印结果
INSERT student (name,age) VALUES (‘ArYe’,15);

1.2、过程拆解

table_name = 'student'
dt = {'name': '小基', 'enrollment_date': '2004-09-01', 'age': 12, 'weight': None}
# 构造INSERT语句
ls = [(k, dt[k]) for k in dt if dt[k] is not None]
sql1 = 'INSERT %s (' % table_name
sql2 = ','.join(i[0] for i in ls)
sql3 = ') VALUES ('
sql4 = ','.join('%r' % i[1] for i in ls)
sql5 = ');'
print(sql1, sql2, sql3, sql4, sql5, sep='\n')
打印结果
INSERT student (
name,enrollment_date,age
) VALUES (
’小基’,‘2004-09-01’,12
);

2、知识补充

2.1、列表推导式

  • 语法:[ 表达式 for 元素 in 列表 if 条件 ]
  • 应用示例:矩阵转置
matrix = [[1, 2],
          [3, 4],
          [5, 6]]
inverse_matrix = [[matrix[r][c] for r in range(len(matrix))] for c in range(len(matrix[0]))]
print(inverse_matrix)
打印结果
[[1, 3, 5],
 [2, 4, 6]]

2.2、repr

表达式打印结果
print(repr(‘A’))‘A’
print(’%r’ % 9)9
print(’{!r}’.format([‘2’, 2]))[‘2’, 2]
  • repr和str区别
class A:
    def __init__(self, i):
        self.i = i
    def __str__(self):
        return repr(self.__dict__)

class B:
    def __init__(self, i):
        self.i = i
    def __repr__(self):
        return repr(self.__dict__)

print([A(i) for i in range(3)])
print([B(i) for i in range(3)])
打印结果
[对象, 对象, 对象]
[{‘i’: 0}, {‘i’: 1}, {‘i’: 2}]

3、备注

应用场景
爬虫数据写入数据库
优点:
通用性好,直接复制可用;简洁;
阅读扩展
字典写入数据库
生成update语句
### 插入 Python 字典数据到 SQL 数据库 为了将 Python 中的字典数据插入到 SQL 数据库,通常会使用特定于目标数据库类型的驱动程序或连接器。对于 MySQLSQL Server 这样的关系型数据库管理系统 (RDBMS),可以分别采用 `mysql-connector-python` 或者 `pymssql/pyodbc` 来建立连接并执行相应的 SQL 命令。 #### 对于 MySQL 的解决方案: 当涉及到向 MySQL 数据库中插入来自 Python 应用的数据时,推荐的做法是利用参数化查询来防止 SQL 注入攻击,并提高代码的安全性和可读性[^1]。下面是一个具体的例子展示怎样把一个包含键值对形式字段名称及其对应值得字典对象换成适合插入操作的形式: ```python import mysql.connector from mysql.connector import errorcode def insert_dict_to_mysql(data_dict, table_name): try: conn = mysql.connector.connect( user='your_username', password='your_password', host='localhost', # or IP address of the server database='test_db' ) cursor = conn.cursor() columns = ', '.join("`" + str(x).replace('/', '_') + "`" for x in data_dict.keys()) values = ', '.join("'" + str(x).replace "'", "''") + "'" for x in data_dict.values()) sql = f"INSERT INTO {table_name} ({columns}) VALUES ({values})" cursor.execute(sql) conn.commit() except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong with your user name or password") elif err.errno == errorcode.ER_BAD_DB_ERROR: print("Database does not exist") else: print(err) finally: if conn.is_connected(): cursor.close() conn.close() data_example = {'name': 'Alice', 'age': 30} insert_dict_to_mysql(data_example, 'users') ``` 这段脚本展示了如何创建一个新的记录条目至名为 users 的表格内;其中包含了两个属性:名字(name)和年龄(age)。 #### 面向 SQL Server 的方法论: 针对 Microsoft 提供的关系型数据库产品—SQL Server,则建议运用 PyMSSQL 或 pyODBC 模块来进行交互。这里给出一段基于 PyMSSQL 实现相同功能的例子: ```python import pymssql def insert_into_sqlserver(table_name, dict_data): keys = list(dict_data.keys()) vals = [dict_data[key] for key in keys] placeholders = ','.join(['%s'] * len(vals)) column_names = ','.join(keys) query = f'INSERT INTO [{table_name}]({column_names}) VALUES ({placeholders});' connection_string = { 'server': 'YOUR_SERVER_ADDRESS', 'database': 'DATABASE_NAME', 'username': 'USER_NAME', 'password': 'PASSWORD' } with pymssql.connect(**connection_string) as conn: with conn.cursor() as cur: cur.execute(query, tuple(vals)) conn.commit() sample_record = {"FirstName": "John", "LastName": "Doe"} insert_into_sqlserver('Persons', sample_record) ``` 此段代码同样实现了将字典样式的输入映射为合适的 INSERT 语句,并安全地将其提交给指定的目标表单[^2]。 #### 最佳实践总结: - 总是以参数化的形式构建 SQL 查询字符串以增强安全性; - 确保所有必要的依赖项都已安装并且版本兼容; - 测试期间应考虑异常处理机制以便更好地调试潜在错误; - 生产环境中务必遵循最小权限原则配置访问控制列表(Access Control Lists, ACLs)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值