首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python: psycopg2: psql:删除行条件

问python: psycopg2: psql:删除行条件
EN

Stack Overflow用户
提问于 2015-07-22 08:16:28
回答 2查看 16.2K关注 0票数 3

我试图在条件下从psql表中删除行。

如果列"TagNaam“等于变量var_tagnaam,我希望删除所有行。

我尝试了下面的代码和一些变体,但我无法使它工作。但是没有任何错误。

代码语言:javascript
复制
cur.execute("DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = %s", (var_tagnaam,))

语法有什么问题吗?

编辑:也许用额外的代码更清楚,错误可能在其他代码中?

代码语言:javascript
复制
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中运行了这个查询,它删除了以下行:

代码语言:javascript
复制
delete FROM opc_actuelewaardentags where "TagNaam" = 'Bakkerij.Device1.DB100INT8';

我试图使它在python中尽可能类似:

代码语言:javascript
复制
var_tagnaam2 = "'"+var_tagnaam+"'"
cur.execute("DELETE FROM opc_actuelewaardentags WHERE \"TagNaam\" = %s", (var_tagnaam2,))
conn.commit()

试图转义双引号,以使其与pgadmin相同。

EN

回答 2

Stack Overflow用户

发布于 2015-07-22 09:45:52

我没有psql服务器,而是mysql服务器。

对于MySQL:

代码语言:javascript
复制
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语法应该类似。因此,

代码语言:javascript
复制
cur.execute("DELETE FROM opc_actuelewaardentags WHERE 'TagNaam' = %s", (var_tagnaam,))

应该是

代码语言:javascript
复制
cur.execute("DELETE FROM opc_actuelewaardentags WHERE TagNaam = %s", (var_tagnaam,))  

或

代码语言:javascript
复制
cur.execute("DELETE FROM opc_actuelewaardentags WHERE `TagNaam` = %s", (var_tagnaam,))  

以上分析为误差.

简单Postgresql语句-列名不存在给出了答案。

票数 0
EN

Stack Overflow用户

发布于 2017-06-21 11:52:19

RobbeM写道:编辑2: pgadmin中的查询成功了,并试图在python中做同样的事情。

我也有过同样的症状--我可以使用pgadmin或SQL控制台删除表行,但是Python代码不能工作。问题是,在建立与postgreSQL服务器的连接之前,我意外地创建了游标:

代码语言:javascript
复制
c = db_conn.cursor()
db_conn = psycopg2.connect(conn_string)

因此,我的解决方案是在建立与数据库的连接之后创建游标:

代码语言:javascript
复制
db_conn = psycopg2.connect(conn_string)
c = db_conn.cursor()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31557559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档