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

Python生成PostgreSQL INSERT语句存文件时的字符串解析问题

生成PostgreSQL INSERT命令的最优方式

问题根源

手动拼接SQL字符串时,不仅容易出现文本字段引号格式错误(如用双引号代替单引号),还会面临SQL注入风险,同时手动处理JSON等复杂类型容易出错。

最优解决方案

使用PostgreSQL官方推荐的Python驱动psycopg2的类型适配功能,它能自动处理不同数据类型的格式转换,包括文本转义、JSON序列化等,完全符合PostgreSQL的语法要求。

方案1:直接执行参数化查询(推荐,安全高效)

如果你的需求是直接向数据库执行插入操作,参数化查询是最安全的方式,驱动会自动处理所有类型转换:

import psycopg2

# 连接数据库(替换为你的数据库信息)
conn = psycopg2.connect("dbname=your_db user=your_user password=your_pwd host=your_host")
cur = conn.cursor()

data = {
    'id': 45,
    'col1': "foo's",
    'col2': {'dict_key': 5}
}

columns = ', '.join(data.keys())
# 生成对应数量的占位符
placeholders = ', '.join(['%s'] * len(data))

# 执行参数化查询,驱动自动处理类型转换
cur.execute(f"INSERT INTO table1({columns}) VALUES ({placeholders});", tuple(data.values()))

# 提交事务并关闭连接
conn.commit()
cur.close()
conn.close()

方案2:生成符合规范的SQL文件

如果需要生成可执行的SQL文件,使用psycopg2的adapt工具来转换每个值,确保格式正确:

import psycopg2
from psycopg2.extensions import adapt, register_adapter, AsIs
import json

# 注册字典适配器,自动将字典转为PostgreSQL JSON类型
def adapt_dict(d):
    return AsIs(f"'{json.dumps(d)}'::json")

register_adapter(dict, adapt_dict)

data = {
    'id': 45,
    'col1': "foo's",
    'col2': {'dict_key': 5}
}

columns = ', '.join(data.keys())
# 用adapt处理每个值,自动转义引号、适配类型
values = ', '.join([adapt(v).getquoted().decode('utf-8') for v in data.values()])

# 生成最终SQL命令
command = f"INSERT INTO table1({columns}) VALUES ({values});"

# 写入文件
with open("file.sql", "w") as f:
    f.write(command)

生成的SQL结果示例:

INSERT INTO table1(id, col1, col2) VALUES (45, 'foo''s', '{"dict_key": 5}'::json);

关键优势

  • 自动处理文本字段的单引号转义(如foo's转为foo''s),完全符合PostgreSQL语法要求
  • 自动适配JSON等复杂类型,无需手动拼接格式
  • 彻底避免SQL注入风险
  • 代码更简洁易维护

内容的提问来源于stack exchange,提问作者bcsta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:45:21