2008-09-16 5 views
2

MySQLdb와 같이 연결을 재설정하지 않고도 psycopg 및 postgres에서 오류를 처리 할 수 ​​있습니까?Python Psycopg 오류 및 연결 처리 (MySQLdb)

results = {'felicitas': 3, 'volumes': 8, 'acillevs': 1, 'mosaics': 13, 'perat\xe9': 1, 'representative': 6....} 
for item in sorted(results): 
    try: 
     cur.execute("""insert into resultstab values ('%s', %d)""" % (item, results[item])) 
     print item, results[item] 
#  conn.commit() 
    except: 
#  conn=psycopg2.connect(user='bvm', database='wdb', password='redacted') 
#  cur=conn.cursor() 
     print 'choked on', item 
     continue 

이 일을 천천히해야한다가, 누군가가 서식 오류를 통해 전달하는 제안을 줄 수 : 아래의 주석 버전은 코멘트가 Psycopg2와 함께 작동하도록, MySQLdb와 함께 작동? 물론 위의 아포스트로피에 초크, 그러나? 등, 다시 연결,

agreement 19 
agreements 1 
agrees 1 
agrippa 9 
choked on agrippa's 
choked on agrippina 
+0

addthings 코드를 추가 할 수 있습니까? 나는 당신이 인용 문제가 있다고 생각한다. – Mauli

답변

2

우선 psycopg는 '%'를 사용하여 직접 포맷을 수행하는 대신 execute() 메소드에 매개 변수를 전달하여 이스케이프 처리를 수행해야합니다. 즉 우리가 쿼리에서 따옴표도 문자열이 아닌 값에 대한 지표로 '% s'을 (를) 사용하지 않도록하는 방법

cur.execute("insert into resultstab values (%s, %s)", (item, results[item])) 

참고. psycopg는 우리를 위해 모든 인용을 할 것입니다.

그런 다음 오류를 무시하려면 롤백하고 계속하십시오.

try: 
    cur.execute("SELECT this is an error") 
except: 
    conn.rollback() 

그게 전부입니다. psycopg는 다음 명령문에서 롤백하고 새로운 트랜잭션을 시작합니다.

2

을 다음과 같은 것을 받고, 또는 확인하지 않고 내가 코드를 순간에 다음과 같습니다 생각 이상 통과 할 수있는 방법이있다 :

그래서
l = "a very long ... text".split() 
for e in l: 
    cursor.execute("INSERT INTO yourtable (yourcol) VALUES ('" + e + "')") 

것은 이런 식으로 변경하려고 :

l = "a very long ... text".split() 
for e in l: 
    cursor.execute("INSERT INTO yourtable (yourcol) VALUES (%s)", (e,)) 

그래서 결코 당신이 캘리포니아에없는, 매개 변수 목록에서 매개 변수를 전달하는 것을 잊지 다시 귀하의 견적과 물건에 대해, 그것은 또한 더 안전합니다. 자세한 내용은 http://www.python.org/dev/peps/pep-0249/

또한 동일한 문을 여러 번 실행하도록 특별히 설계된 .executemany() 메서드를 살펴보십시오.

+0

고마워, 나는 당신이 제안한대로 문자열 할당을한다. 내 큰 문제는 무언가를 추가하려고 할 때 연결이 끊어져서 다시 설정해야한다는 것입니다. mysqldb와 같은 방식으로 오류를 건너 뛸 수있는 방법이 있는지 궁금합니다. 예외 처리 – unmounted