使用psycopg2操作PostgreSQL触发StringDataRightTruncation报错求助
报错原因
该psycopg2.errors.StringDataRightTruncation报错的核心是PostgreSQL的vulnerabilities表中,description字段被定义为character varying(255)类型,最多仅支持存储255个字符,你要写入的漏洞描述文本长度远超该限制,导致写入被拒绝。
解决方案
优先选择以下两种方案调整数据库字段配置:
- 方案1(最推荐):修改字段为TEXT类型
漏洞描述属于不定长的长文本,无需限制存储长度,PostgreSQL的TEXT类型性能和varchar无差异,且无长度限制,执行以下SQL修改字段即可:ALTER TABLE vulnerabilities ALTER COLUMN description TYPE TEXT; - 方案2:扩大varchar字段长度
如果你确实需要保留varchar类型,可根据业务侧最长的漏洞描述长度,把字段长度调整到足够大,比如调整为2000长度:ALTER TABLE vulnerabilities ALTER COLUMN description TYPE character varying(2000);
额外代码优化建议
你当前使用f-string拼接SQL的写法存在严重的SQL注入风险,且手动替换单引号的方式无法覆盖所有特殊字符场景,建议改为psycopg2官方推荐的参数化查询写法,修改后代码如下:
def add_json(value): id = random.randint(1,10000) for val in value['vulns']: # 用参数化查询后无需手动处理单引号,原异常处理逻辑可删除 des = val['description'] print(des) cursor.execute( "INSERT INTO vulnerabilities (id,name,severy,ref,description) VALUES (%s, %s, %s, %s, %s)", (random.randint(1,10000), val['name'], val['severity'], '{' + ','.join(val['ref']) + '}', des) ) conn.commit() conn.close()
参数化查询会自动处理所有特殊字符的转义,既避免SQL注入风险,也不会因为文本中包含特殊符号触发SQL语法错误。
内容的提问来源于stack exchange,提问作者Bumin Qagan
相关产品推荐
相关产品推荐

