python:psycopg2:psql:删除条件

时间:2015-07-22 08:16:28

标签: python postgresql psql

我试图在某个条件下从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中的相同。

3 个答案:

答案 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

More is here...

答案 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()