确认Postgres“更新”查询在python中有效

som*_*me1 3 python postgresql

我已经用python编写了我的第一个“更新”查询,虽然看起来正确,但是我不确定如何接收回输出以确认其工作。

应该加载一个CSV文件,并将第一列中的值替换为第二列中的值:

def main():
    try:
        conn=psycopg2.connect("dbname='subs' user='subs' host='localhost' password=''")
    except:
        print "I am unable to connect to the database."
        sys.exit()

    with open("dne.txt", "r+") as f:
        for line in f:
            old = line.split(',')[0].strip()
            new = line.split(',')[1].strip()
            cur = conn.cursor()
            cur.execute("UPDATE master_list SET subs = '{0}' WHERE subs = '{1}';".format(new, old))
            conn.commit()
            results = cur.fetchall()
            for each in results:
                print str(each)


if __name__=="__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

我以为结果(每次更改都为UPDATE 1吗?)会以元组形式返回,但我却报错:

psycopg2.ProgrammingError: no results to fetch
Run Code Online (Sandbox Code Playgroud)

我不确定这是否意味着我的查询无法正常工作并且没有更新,或者我不能像尝试那样使用fetchall()。

欢迎任何反馈或建议!

lea*_*ncz 6

UPDATE语句将不返回任何值,因为您要数据库更新其数据以不检索任何数据。

到目前为止,获取行数更新的最佳方法是使用cur.rowcount。这也适用于其他驱动程序,例如用于Postgresql的Psycopg2就是相同的语法。

cur.execute("UPDATE master SET sub = ('xyz') WHERE sub = 'abc'")
print(cur.rowcount)
Run Code Online (Sandbox Code Playgroud)

检查更新的一种更round回的方法是在更新表之后对表运行SELECT。您应该获得返回的数据。在下面的示例中,第一个SELECT将返回发生更新的行。更新之后的第二个SELECT应该不返回任何行,因为您已经更新了所有字段。第三个SELECT应该返回您已更新的行,以及已经存在的带有'xyz'值的行。

import sqlite3

def main():
    try:
        conn=sqlite3.connect(":memory:")
        cur = conn.cursor()
        cur.execute("create table master(id text, sub text)")
        cur.execute("insert into master(id, sub) values ('1', 'abc')")
        cur.execute("insert into master(id, sub) values ('2', 'def')")
        cur.execute("insert into master(id, sub) values ('3', 'ghi')")
        conn.commit()
    except:
        print("I am unable to connect to the database.")
        sys.exit()

    cur.execute("select id, sub from master where sub='abc'")
    print(cur.fetchall())
    cur.execute("UPDATE master SET sub = ('xyz') WHERE sub = 'abc'")
    conn.commit()
    cur.execute("select id, sub from master where sub='abc'")
    print(cur.fetchall())
    cur.execute("select id, sub from master where sub='xyz'")
    print(cur.fetchall())

if __name__=="__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

  • @leancz cur.rowcount 是一个更好的答案,你应该在你的主要信息中这样表述。比另一个选择快得多。它也适用于其他驱动程序,就像用于 Postgresql 的 Psycopg2 一样,它的语法是相同的。 (2认同)