سؤال

هل هناك طريقة لجعل psycopg و بوستجرس التعامل مع الأخطاء دون الحاجة إلى إعادة تأسيس الاتصال ، مثل MySQLdb?وقد علق نسخة من أدناه يعمل مع 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