لا يتم تحديث قاعدة البيانات تلقائيا باستخدام MySQL و Python

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

  •  23-08-2019
  •  | 
  •  

سؤال

أواجه بعض المشاكل في تحديث صف في قاعدة بيانات MySQL. هنا هو الرمز الذي أحاول تشغيله:

import MySQLdb

conn=MySQLdb.connect(host="localhost", user="root", passwd="pass", db="dbname")
cursor=conn.cursor()

cursor.execute("UPDATE compinfo SET Co_num=4 WHERE ID=100")
cursor.execute("SELECT Co_num FROM compinfo WHERE ID=100")
results = cursor.fetchall()

for row in results:
    print row[0]

print "Number of rows updated: %d" % cursor.rowcount

cursor.close()
conn.close()

الناتج أحصل عليه عند تشغيل هذا البرنامج هو:

4
عدد الصفوف المحدثة: 1

يبدو أنه يعمل ولكن إذا استدعت قاعدة البيانات من واجهة سطر الأوامر MySQL (CLI)، أجد أنه لم يتم تحديثه على الإطلاق. ومع ذلك، إذا من CLI أدخل UPDATE compinfo SET Co_num=4 WHERE ID=100; يتم تحديث قاعدة البيانات كما هو متوقع.

ما هي مشكلتي؟ أنا أقوم بتشغيل Python 2.5.2 مع MySQL 5.1.30 على مربع Windows.

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

المحلول

لست متأكدا، لكنني سأعتقد أنك تستخدم طاولة InnoDB، وأنت لم تقم بالارتكاب. أعتقد أن MySQLDB تمكن المعاملات تلقائيا.

يتصل conn.commit() قبل الاتصال close.

من الأسئلة الشائعة: بدءا من 1.2.0، تعطيل MySQLDB AutoCommIm بشكل افتراضي

نصائح أخرى

MySQLDB لديه autocommit قبالة افتراضيا، والتي قد تكون مربكة في البداية. يوجد اتصالك في معاملاته الخاصة ولن تكون قادرا على رؤية التغييرات التي تقوم بها من اتصالات أخرى حتى تلتزم تلك المعاملة.

يمكنك إما أن تفعل conn.commit() بعد عبارة التحديث حيث أشار آخرون، أو تعطيل هذه الوظيفة تماما عن طريق الإعداد conn.autocommit(True) مباشرة بعد إنشاء كائن الاتصال.

تحتاج إلى ارتكاب تغييرات يدويا أو تحويل الالتزام التلقائي.

السبب في تحديد إرجاع البيانات المعدلة (ولكن غير مستمرة) لأن الاتصال لا يزال في نفس المعاملة.

لقد وجدت أن موصل Python يقوم تلقائيا بتشغيل Autocommit، ولا يبدو أنه لا يوجد أي طريقة لتغيير هذا السلوك. بالطبع يمكنك تشغيله مرة أخرى، ولكن بعد ذلك النظر إلى سجلات الاستعلام، فإنه بغباء استفسارين بلا معنى بعد الاتصال بدوره إيقاف تشغيل AutoCommit ثم مرة أخرى.

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