我正在尝试根据条件从 psql 表中删除行。
如果“TagNaam”列等于变量 var_tagnaam,我希望删除所有行。
我已经尝试了以下代码和一些变体,但我无法让它工作。 不过没有任何错误。
cur.execute("DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = %s", (var_tagnaam,))
语法有问题吗?
编辑: 也许用额外的代码更清楚,错误可能在其他代码中?
for i in range(len(taginhoud)):
(var_tagnaam, var_tagwaarde, var_tagkwaliteit, var_tagtime) = taginhoud[i]
print (var_tagnaam)
cur.execute("DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = %s", (var_tagnaam,))
conn.commit()
cur.execute('INSERT INTO opc_actuelewaardentags ("TagNaam", "TagWaarde", "TagKwaliteit", create_date, write_date) VALUES (%s,%s,%s,now(),now())',
(var_tagnaam, var_tagwaarde, var_tagkwaliteit))
conn.commit()
所以我在这里尝试做的是:
从列表“taginhoud”中检索“var_tagnaam”。
然后在表 opc_actuelewaardentags 中找到列“Tagnaam”等于“var_tagnaam”中的值的所有行。 (应该是字符串)
然后删除那些“Tagnaam”=“var_tagnaam”的行。这部分不起作用。
然后插入带有数据的新行。这部分有效。
这段代码会不会做我想做的事情是错误的?
我已经尝试了很多方法来解决大写/小写问题。
编辑 2:pgadmin 中的查询有效,试图在 python 中做同样的事情:
我在 pgadmin 中运行了这个查询,它删除了行:
delete FROM opc_actuelewaardentags where "TagNaam" = 'Bakkerij.Device1.DB100INT8';
我试图让它在 python 中尽可能相似:
var_tagnaam2 = "'"+var_tagnaam+"'"
cur.execute("DELETE FROM opc_actuelewaardentags WHERE \"TagNaam\" = %s", (var_tagnaam2,))
conn.commit()
试图转义双引号以使其与 pgadmin 中的相同。
最佳答案
'TagNaam'
不是 sql 语言中的有效 column_name 标识符。数据库名、表名、列名不能使用单引号或双引号,可以使用撇号(`)。
无效:
DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = 'test';
DELETE FROM opc_actuelewaardentags WHERE "TagNaam"= 'test';
有效:
DELETE FROM opc_actuelewaardentags WHERE TagNaam = 'test';
DELETE FROM opc_actuelewaardentags WHERE `TagNaam` = 'test';
DELETE FROM opc_actuelewaardentags WHERE "TagNaam" = 'test';
更新:根据 PSQL 文档,双引号是表名和列名中的有效字符。当使用 a 作为表名或列名时,它特别用于关键字。所以以下是有效的:
DELETE FROM opc_actuelewaardentags WHERE "TagNaam" = 'test';
关于python:psycopg2:psql:删除条件所在的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557559/