python:psycopg2:psql:删除条件所在的行

python:psycopg2:psql:删除条件所在的行,python,postgresql,psql,Python,Postgresql,Psql,我试图在一个条件下从psql表中删除行 如果列“TagNaam”等于变量var_TagNaam,我希望删除所有行 我尝试了以下代码和一些变体,但无法使其正常工作。 但是没有任何错误 cur.execute("DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = %s", (var_tagnaam,)) 语法有问题吗 编辑: 也许更多的代码更清楚,错误可能在其他代码中 for i in range(len(taginhoud)): (v

我试图在一个条件下从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_ACTUELEWARDENTAGS中查找列“Tagnaam”等于“var_Tagnaam”中的值的所有行。(应该是字符串)

然后删除“Tagnaam”=“var_Tagnaam”所在的行。这部分不行

然后插入包含数据的新行。这部分是有效的

做我想做的事情,这个代码可能是错误的吗

我已经尝试了很多方法来解决大写/小写问题

编辑2:pgadmin中的查询工作正常,尝试在python中执行相同的操作:

var_tagnaam2 = "'"+var_tagnaam+"'"
cur.execute("DELETE FROM opc_actuelewaardentags WHERE \"TagNaam\" = %s", (var_tagnaam2,))
conn.commit()
我在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中的相同。

我没有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,))  

以上分析是错误的。


给出答案。

'TagNaam'
在sql语言中不是有效的列名标识符。在写入数据库名、表名或列名时不能使用单引号或双引号,但可以使用撇号(`)

无效:

从opc_actuelewaardentags中删除,其中“TagNaam”=“test”

有效期:

更新:根据PSQL dosc,双引号是表名和列名中的有效字符。当使用a作为表或列名时,它特别用于关键字。因此,以下是有效的:

DELETE FROM opc_actuelewaardentags WHERE "TagNaam" = 'test';

RobbeM写道:Edit2:pgadmin中的查询工作正常,尝试在python中执行相同的操作

我也有同样的症状——我可以使用pgadmin或在SQL控制台中删除表行,但Python代码不起作用。问题是,在与postgreSQL server建立连接之前,我无意中创建了游标:

c = db_conn.cursor()
db_conn = psycopg2.connect(conn_string)
因此,我的解决方案是在与数据库建立连接后创建游标:

db_conn = psycopg2.connect(conn_string)
c = db_conn.cursor()

您是否尝试过提交更改?应该类似于
cur.commit()
是的,我做了。没有更改任何内容。似乎您需要
commit()
连接,而不是光标。如果这不起作用-我建议阅读psql日志。也许你必须告诉数据库使用什么模式。我使用了conn.commit()。cur.commit()给了我错误。
TagNaam
是否表示列?感谢您的评论,我想您只是删除了TagNaam周围的引号?它不起作用,因为我的列名有大写和小写字母。这就是我需要报价的原因。它给出了一个错误:“tagnaam”列在我尝试您的代码时不存在。我已经添加了另一个解决方案。希望它有用。应该是有帮助的。我尝试了以下方法:cur.execute(“从opc_actuelewaardentags中删除,其中
TagNaam
='test')),但给出了错误:psycopg2.ProgrammingError:column“TagNaam”不存在第1行:从opc_actuelewaardentags中删除,其中
TagNaam
='test'您应该将表名放在双引号中,因为psql在默认情况下将其转换为小写,并且您的列名具有大写字母。整个查询应该用三引号或单引号表示。
c = db_conn.cursor()
db_conn = psycopg2.connect(conn_string)
db_conn = psycopg2.connect(conn_string)
c = db_conn.cursor()