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

使用SQLAlchemy操作PostgreSQL时更新表值失败并触发TypeError问题求助

问题排查与解决方案

首先,你的代码里存在几个关键问题,导致更新失败且触发TypeError,我们一步步拆解:

1. SQL UPDATE语句语法完全错误

PostgreSQL的UPDATE语法格式是:

UPDATE 表名 SET 字段名 = 字段值 WHERE 条件;

你写的"UPDATE products FROM Category WHERE id = 1" + " SET products = " + products2完全不符合规范——你把要更新的字段和表名搞反了,正确的语句应该是更新Category表的products字段,而非UPDATE products。

2. 字符串拼接SQL引发的语法错误与安全风险

products2是JSON格式的字符串,直接拼到SQL语句里会因为没有被单引号包裹,导致PostgreSQL无法识别为合法的字符串值,这会触发语法错误;同时这种字符串拼接方式存在严重的SQL注入风险,绝对不推荐在生产环境使用。

3. 参数传递错误导致TypeError: dict is not a sequence

当使用db.engine.execute执行带参数的SQL时,需要把参数以**序列(比如元组)**的形式传递,而不是直接拼接字符串。如果错误地传递了非序列类型(比如字典),就会触发这个类型错误。


正确的解决方案

推荐两种方式,优先使用ORM方式(更符合SQLAlchemy的最佳实践):

方式一:使用SQLAlchemy ORM更新(最安全简洁)

既然你已经在使用db.session,直接通过ORM模型操作会更简单,还能避免语法错误:

import json

# 1. 查询要更新的Category记录
category = Category.query.get(1)
if category:
    # 2. 更新products字段:如果你的products字段是JSON/JSONB类型,直接传字典即可,无需json.dumps
    # 如果是TEXT/VARCHAR类型,再用json.dumps转成字符串
    category.products = json.dumps([{'info': 'info'}])
    # 3. 提交事务
    db.session.commit()

方式二:使用参数化原生SQL更新

如果一定要用原生SQL,必须用参数化查询来传递值,避免字符串拼接:

import json
from sqlalchemy import text

products2 = json.dumps([{'info': 'info'}])
# 用text()包裹SQL语句,并用命名参数传递值,避免类型错误和SQL注入
db.engine.execute(text("UPDATE Category SET products = :products WHERE id = 1"), {"products": products2})
db.session.commit()

额外提醒

检查你的Category表中products字段的类型:

  • 如果是JSON或JSONB类型,不需要手动调用json.dumps(),直接赋值Python字典[{'info': 'info'}]即可,SQLAlchemy会自动帮你序列化到数据库。
  • 如果是TEXT或VARCHAR类型,才需要用json.dumps()转成字符串存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:27:31