繁体   English   中英

使用 psycopg2 与 PostgreSQL 中的更新表进行比较不起作用

[英]Comparison to update table in PostgreSQL with psycopg2 doesn't work

我想使用 Python 的 psycopg2 更新 PostgreSQL 中的表。 对于每一行,我想比较 steine > 4 以及 boden 是否等于 Ss、Su、Tt 或 Leer,通过将 weienauschluss = True 设置为 False,从而将这些列从我的以下计算中排除。

但是,只有 steine 的比较有效,而 boden 的比较无效。 比较有问题吗? 我尝试以各种方式设置它,但它们似乎都不起作用。

steine 的数据类型是整数,boden 的数据类型是字符串。

这是我的代码:

import psycopg2

conn = psycopg2.connect(*****)
cur = conn.cursor()

sql = "select min(id), max(id) from bsd_horizonte_test;"
cur.execute(sql)
gidsextent = cur.fetchall()
minimum = gidsextent[0][0]
maximum = gidsextent[0][1]


for gid in range(minimum,maximum+1):
    weizenausschluss = False
    sql = "select grobbod_k, boart from bsd_horizonte_test where id = " + str(gid) + ";"
    cur.execute(sql)
    data = cur.fetchall()
    if len(data) > 0:
        steine = data[0][0]
        boden = data[0][1]
        if steine > 4:
            weizenausschluss = True
        if boden == "Ss" or boden == "Su" or boden == "Tt" or boden == "Leer":
            weizenausschluss = True
        if weizenausschluss == False:
            sql = "update bsd_horizonte_test set weizen_ok = True where id = " + str(gid) + ";"
            cur.execute(sql)
            conn.commit()
        else:
            sql = "update bsd_horizonte_test set weizen_ok = False where id = " + str(gid) + ";"
            cur.execute(sql)
            conn.commit()
    print(gid)
        
#Close communication with the database
conn.commit()
cur.close()
conn.close()    

谢谢!

为什么不让 Postgresql 在单个查询中完成这项工作? 只需cur.execute这个查询,它就会完成这一切。

update bsd_horizonte_test 
set weizen_ok = not (steine > 4 or boden in ('Su', 'Tt', 'Leer'))
-- where id between (select min(id) from bsd_horizonte_test) and (select max(id) from bsd_horizonte_test)
;

顺便说一句,为什么要循环所有值 b/w min(id) 和 max(id)? 这些是id所有可能值,因此您可以安全地注释第三个查询行。 我写它只是为了在字面上等同于你的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM