لماذا لا يكون للاتصال في Python's DB-API عملية "البداية"؟

StackOverflow https://stackoverflow.com/questions/2546926

  •  23-09-2019
  •  | 
  •  

سؤال

العمل مع المؤشرات في Mysql-Python اعتدت أن أسميها "Begin ؛" ، "الالتزام ؛" ، و "Rollback ؛" صراحة على النحو التالي:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")

ثم اكتشفت أن كائن الاتصال الأساسي لديه الطرق المقابلة:

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()

فحص db-api pep اكتشفت أنه لا يذكر طريقة Begin () لكائن الاتصال ، حتى بالنسبة للملحقات.

Mysql-Python ، بالمناسبة ، يرمي deprecationwarning ، عندما تستخدم الطريقة. SQLite3.Connection ، على سبيل المثال ، ليس لديه الطريقة على الإطلاق.

والسؤال هو لماذا لا توجد طريقة من هذا القبيل في PEP؟ هل البيان اختياري بطريقة أو بأخرى ، هل يكفي استدعاء الالتزام () بدلاً من ذلك؟

هل كانت مفيدة؟

المحلول 2

قررت أن أجيب على نفسي:

أ الموضوع حول معاملات DB API 2.0 في قائمة بيثون والمقتطف التالي من الكتاب الملحوظ SQL المرجع الكامل اجعلني أعتقد أن DB API تنفذ السلوك القياسي SQL1:

حدد الإصدار الأول من SQL Standard (SQL1) وضع معاملة ضمني ، استنادًا إلى دعم المعاملة في الإصدارات المبكرة من DB2. في الوضع الضمني ، يتم دعم فقط عبارات الالتزام والتراجع. تبدأ معاملة SQL تلقائيًا ببيان SQL الأول الذي تم تنفيذه بواسطة مستخدم أو برنامج وينتهي عند تنفيذ الالتزام أو التراجع. تبدأ نهاية معاملة واحدة ضمنيًا.

يبدو أن وضع المعاملة الصريح (SQL2 و SQL: 1999) مفيد عندما يدعم RDBSM وضع الالتزام التلقائي والاتصال الحالي في هذا الوضع ، لكن واجهة برمجة تطبيقات DB لا تعكسه فقط.

نصائح أخرى

بحث هذا السؤال الذي تم طرحه مسبقًا. بشكل عام ، فإن "البروتوكول" المراد استخدامه مع المعاملات هو:

cursor = conn.cursor()
try:
    cursor.execute(...)
except DatabaseError:
    conn.rollback()
    raise
else:
    conn.commit()
finally:
    cursor.close()

بدءا من بيثون 2.6 sqlite Connection يمكن استخدام الكائنات كمديرين سياقين يرتكبون أو تراجعًا تلقائيًا المعاملات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top