为什么我的Python脚本将Postgres表的所有行设置为相同的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的Python脚本将Postgres表的所有行设置为相同的值?相关的知识,希望对你有一定的参考价值。

我有一个Python3脚本,它检查存储在数据库中的URL的有效性,并根据结果在终端窗口中打印“TRUE”或“FALSE”。

我正在尝试更改它以将结果上传到同一个表中,但是目前它只是将列中的所有行(url_valid类型BOOL)设置为“TRUE”,这与终端中打印的结果是正确的不同。

我认为这是因为我的SQL查询中没有包含“where”子句,但那是因为我不确定如何从SQL调用Python脚本的输出。

其他可能性包括我的“cursor.execute(”或commit语句,但我不确定。

这是我的代码片段:

dbconn = create_engine('postgresql+psycopg2://' + user + ':' + password + '@' + host + ':' + str(port) + '/' + database , echo=False)
dbconnraw = dbconn.raw_connection()
cur = dbconnraw.cursor()
cur.execute('SELECT email_domain_url FROM contacts_unlisted_umatch')
rows = cur.fetchall()

for row in rows:
    try:
        response = requests.get(row[0])
        urlstat = response.status_code
        if urlstat<400:
            print('TRUE')
            cur.execute("UPDATE contacts_unlisted_umatch SET url_valid = 'TRUE'")
            dbconnraw.commit()
        else:
            print('FALSE')
            cur.execute("UPDATE contacts_unlisted_umatch SET url_valid = 'FALSE'")
            dbconnraw.commit()
    except Exception:
        print('FALSE')
        cur.execute("UPDATE contacts_unlisted_umatch SET url_valid = 'FALSE'")
        dbconnraw.commit()
        pass

我可以更改什么来更新每个行的值而不是将它们全部设置为“TRUE”?

答案

在SQL语句中添加“WHERE”子句。如果没有“WHERE”子句,则告诉它更新表中的每一行。

例如,“UPDATE contacts_unlisted_umatch SET url_valid ='TRUE'where email_domain_url = ...”,这将只更新“email_domain_url”的url_valid值。

以上是关于为什么我的Python脚本将Postgres表的所有行设置为相同的值?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:更新所有表的主键序列

将python脚本导入zabbix?

如何从本地系统连接到 Linode 中的 postgres

Postgres:在从 bash 脚本重新创建/重新填充之前清除整个数据库

将 Postgres RDS 模式复制到 Redshift

您如何在 Postgres 中找到所有表的行数