我试图在某个条件下从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()
所以我在这里尝试做的是:
检索" var_tagnaam"从列表" taginhoud"。
然后在表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中的相同。
答案 0 :(得分:1)
DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = 'test';
不是sql语言中的有效column_name标识符。在编写数据库名称,表名或colunm名称时,不得使用单个或double 引号,但可以使用撇号(`)。
无效:
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 dosc,双引号是表名和列名中的有效字符。它特别用于关键词,同时使用a作为表或列名。以下是有效的:
minSdkVersion 13
targetSdkVersion 22
答案 1 :(得分:0)
我没有psql服务器,但是没有mysql服务器。
对于MySQL:
mysql> select * from user where '1' = '1';
+------+
| id |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.05 sec)
mysql> select * from user;
+------+
| id |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.00 sec)
mysql> select * from user where '1' = "1";
+------+
| id |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.00 sec)
mysql> select * from user where 'id' = "1";
Empty set (0.00 sec)
mysql> select * from user where 'id' = 1;
Empty set, 1 warning (0.02 sec)
mysql> select * from user where id = 1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.02 sec)
mysql> select * from user where 'id' = "id";
+------+
| id |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.00 sec)
SQL语法应该类似。因此,
cur.execute("DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = %s", (var_tagnaam,))
应该是
cur.execute("DELETE FROM opc_actuelewaardentags WHERE TagNaam = %s", (var_tagnaam,))
或
cur.execute("DELETE FROM opc_actuelewaardentags WHERE `TagNaam` = %s", (var_tagnaam,))
以上分析是错误的。
Simple Postgresql Statement - column name does not exists给出了答案。
答案 2 :(得分:0)
RobbeM写道:编辑2:pgadmin中的查询工作,试图在python中做同样的事情
我有相同的症状 - 我可以使用pgadmin或SQL控制台删除表行,但Python代码不起作用。事情是我在与postgreSQL服务器建立连接之前意外创建了游标:
c = db_conn.cursor()
db_conn = psycopg2.connect(conn_string)
所以,我的解决方案是在与数据库建立连接后创建游标:
db_conn = psycopg2.connect(conn_string)
c = db_conn.cursor()