2

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
4

2 に答える 2

2

まず最初に、'%'を使用して自分でフォーマットするのではなく、execute()メソッドにパラメーターを渡して、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はロールバックし、次のステートメントで新しいトランザクションを開始します。

于 2009-01-21T01:43:57.897 に答える
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()もご覧ください。

于 2008-09-16T10:04:53.967 に答える