使用psycopg2+aiogram开发Telegram购物车,数据无法写入korzina列
问题分析与解决
核心错误点
- SQL语法错误:你用了
INSERT...FROM的错误语法,要更新已有用户的购物车数据,应该用UPDATE语句(INSERT是插入新记录,不符合你修改已有用户数据的需求)。 - 游标使用错误:
connection.cursor()是创建游标对象,不能直接把SQL语句传进去,必须通过游标对象的execute()方法执行SQL。 - 字符串拼接的语法风险:直接用
{id_tovara}和{us_id}拼接SQL,不仅存在SQL注入风险,还会因为korzina是text类型,值未加引号导致语法错误。
修正后的代码
# 创建游标对象 cur = connection.cursor() # 使用UPDATE语句+参数化查询执行更新 cur.execute( "UPDATE bot_users SET korzina = %s WHERE user_id = %s", (id_tovara, us_id) ) # 提交事务 connection.commit() # 关闭游标 cur.close()
补充优化方案
如果需要实现购物车追加商品(而非覆盖原有内容),可以借助PostgreSQL的字符串处理函数,同时兼容空值情况:
cur.execute( "UPDATE bot_users SET korzina = COALESCE(korzina || ', ', '') || %s WHERE user_id = %s", (id_tovara, us_id) )
这里COALESCE会处理korzina为空的情况,避免开头出现多余的逗号。
内容的提问来源于stack exchange,提问作者Александр Денисов
相关产品推荐
相关产品推荐

