我已经用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()。
欢迎任何反馈或建议!
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)
| 归档时间: |
|
| 查看次数: |
3543 次 |
| 最近记录: |