postgres 'update'쿼리가 파이썬에서 작동했는지 확인

2014-01-22 2 views
1

python으로 첫 번째 '업데이트'쿼리를 작성했습니다. 올바른 것으로 보이지만 출력 확인을 위해 출력을받는 방법을 잘 모르겠습니다 ..postgres 'update'쿼리가 파이썬에서 작동했는지 확인

이 은 두 번째에 그와 함께 첫 번째 열에 값을 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() 

내가 결과를 생각 튜플로 돌아올 것 (각 변경 UPDATE 1?) 하지만 대신 오류가 발생했습니다.

psycopg2.ProgrammingError: no results to fetch 

내 쿼리가 작동하지 않고 업데이트가 없거나, 시도하고있는 것처럼 fetchall()을 사용할 수없는 경우 확실하지 않습니다.

의견이나 제안 환영합니다!

+0

가져 오기 전에 데이터를 커밋 해 보셨습니까? 나는 cur.commit()을 의미합니다. 귀하의 케이스에서 유용할지 모르겠지만 때로는 커밋하지 않는 것이 문제입니다. – Lafexlos

+0

@ Lafexlos - cur.commit() AttributeError : 'psycopg2._psycopg.cursor'객체에 'commit'속성이 없습니다. – some1

+1

아 죄송합니다. conn.commit()을 의미했습니다. 오타입니다. – Lafexlos

답변

3

UPDATE 문은 데이터베이스에서 데이터를 검색하지 않도록 데이터를 업데이트하도록 요청할 때 값을 반환하지 않습니다.

업데이트 된 행 수를 얻는 가장 좋은 방법은 cur.rowcount를 사용하는 것입니다. 이것은 다른 드라이버에서도 작동합니다. Postgresql의 Psycopg2와 같은 문법입니다.

cur.execute("UPDATE master SET sub = ('xyz') WHERE sub = 'abc'") 
print(cur.rowcount) 

업데이트를 확인하는 원형 교차로는 업데이트 후 테이블에 대해 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() 
+0

감사합니다. 따라서 업데이트 쿼리를 수행 한 후에 직접 응답을 얻을 수있는 방법이 없습니까? – some1

+1

sqlite의 경우 마지막 업데이트에서 영향을받은 행의 수를 기록하는 커서에 "rowcount"속성이 있습니다. print (cur.rowcount) 이것은 Postgres에도 마찬가지입니다. – leancz

+0

인쇄에 추가됩니다 (cur.rowcount) 기본적으로 그것을했는데, 그것은 "1"48 번, csv 파일의 행 수를 인쇄했습니다. – some1

관련 문제