我试图在条件下从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相同。
发布于 2015-07-22 09:45:52
我没有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,)) 以上分析为误差.
简单Postgresql语句-列名不存在给出了答案。
发布于 2017-06-21 11:52:19
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()https://stackoverflow.com/questions/31557559
复制相似问题