Pergunta

Existe uma maneira de fazer psycopg e postgres lidar com erros sem ter para restabelecer a conexão, como MySQLdb?O comentou versão do abaixo funciona com MySQLdb, os comentários de fazer o trabalho com 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

Este deve desacelerar as coisas, alguém poderia dar uma sugestão para passar por cima de erros de formatação?Obviamente, acima engasga em apóstrofos, mas há uma maneira de fazê-lo passar mais de que sem ficando algo como o seguinte, ou cometer, encontros, etc.?:

agreement 19
agreements 1
agrees 1
agrippa 9
choked on agrippa's
choked on agrippina
Foi útil?

Solução

Primeiro de tudo você deve deixar psycopg fazer a escapar para você, passando para o método execute() os parâmetros em vez de fazer a formatação de si mesmo com '%'.O que é:

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

Observe como usamos "%s" como um marcador até mesmo para os não-valores de seqüência de caracteres e evitar aspas na consulta.psycopg vai fazer a cotação para nós.

Então, se você deseja ignorar alguns erros, apenas a reversão e continuar.

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

Isso é tudo.psycopg será anulação e iniciar uma nova transação em sua próxima declaração.

Outras dicas

Eu acho que seu código tenha esta aparência no momento:

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

De modo a tentar transformá-lo em algo como isto:

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

por isso, nunca se esqueça de passar parâmetros a lista de parâmetros, então você não terá que se preocupar em suas cotações e outras coisas, é também mais seguro.Você pode ler mais sobre isso em http://www.python.org/dev/peps/pep-0249/

também dê uma olhada lá no método .executemany (), que é projetado especialmente para executar a mesma instrução várias vezes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top