문제

MySQLdb처럼 연결을 다시 설정하지 않고도 psycopg와 postgres가 오류를 처리하도록 하는 방법이 있습니까?아래의 주석이 달린 버전은 MySQLdb에서 작동하며 주석을 통해 Psycopg2에서 작동합니다.

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

이로 인해 속도가 느려질 수 있습니다. 서식 오류를 전달하는 방법을 제안할 수 있는 사람이 있습니까?분명히 위의 내용은 아포스트로피 때문에 질식하지만 다음과 같은 내용을 얻거나 커밋, 재연결 등을 하지 않고 이를 통과시킬 수 있는 방법이 있습니까?

agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina
도움이 되었습니까?

해결책

우선 '%'를 사용하여 직접 서식을 지정하는 대신 매개변수를 실행() 메서드에 전달하여 psycopg가 이스케이프 작업을 수행하도록 해야 합니다.그건:

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

문자열이 아닌 값에 대해서도 "%s"를 마커로 사용하고 쿼리에서 따옴표를 피하는 방법에 유의하세요.psycopg가 우리를 위해 모든 인용 작업을 수행할 것입니다.

그런 다음 일부 오류를 무시하려면 롤백하고 계속하세요.

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

그게 다야.psycopg는 다음 명세서에서 롤백하고 새 거래를 시작합니다.

다른 팁

현재 귀하의 코드는 다음과 같습니다.

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() 메서드를 살펴보세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top