اذهب إلى المحتوى

السؤال

نشر

كنت أستعمل قواعد بيانات MySQL ، ولكن هذه المرة الأولى التي أتعامل فيها مع SQLite وقمت بكتابة الكود التالي:

@app.route('/api/v1/register', methods=['POST'])
def register():
    form = RegisterForm(request.form)
    if form.validate():
        name     =  form.name.data 
        email    = form.email.data
        username = form.username.data
        password = form.password.data

        # هذا السطر يسبب خطأ
        c.execute("INSERT INTO users(name,email,username,password) VALUES(?,?,?,?)", [name, email, username, password])

        conn.commit()
        conn.close()

ولكن في كل مرة أقوم بزيارة هذا المسار يظهر لي الخطأ التالي:

File "C:\Users\Mohssen\projects\blog\app.py", line 59, in register c.execute("INSERT INTO users(name,email,username,password) VALUES(?,?,?,?)", [name, email, username, password])
 ProgrammingError: SQLite objects created in a thread can only be used in that 
 same thread.The object was created in thread id 24619 and this is thread id 
 23731

كيف يمكنني حل هذه المشكلة؟

Recommended Posts

  • 1
نشر

يمكن حل هذه المشكلة بأكثر من طريقة على النحو التالي:
الطريقة الأولى هي فتح إتصال بقاعدة البيانات مع تمرير المعامل check_same_thread بقيمة Flase لكي لا يظهر هذا الخطأ على الإطلاق، وهذه هي الطريقة الأسهل، لأنك لن تضطر إلى التعديل على الكود إلا في مكان واحد، كالتالي:

conn = sqlite3.connect('database-name.db', check_same_thread=False)

الطريقة الأخرى هي فتح إتصال بقاعدة البيانات داخل الدالة register نفسها بإستخدام الجملة with لكي يتم غلق الإتصال تلقائيًا بمجرد الإنتهاء منه:

@app.route('/api/v1/register', methods=['POST'])
def register():
  # باقي كود الدالة هنا
  
  with sql.connect("database-name.db") as conn:
    name = "bob"
    cur = conn.cursor()
    cur.execute("INSERT INTO users(name,email,username,password) VALUES(?,?,?,?)", [name, email, username, password])
    conn.commit()

   return "Successful"

بهذا الشكل سوف يعمل كود SQLite بدون مشكلة.

  • 0
نشر

المشكلة هي في فتح الاتصال بقاعدة البيانات من Thread ثم التعامل معها من thread اخر و الحل هو فتح الاتصال في الدالة نفسها ثم أداء التعاملات مع القاعدة ثم غلقها في الدالة

@app.route('/api/v1/register', methods=['POST'])
def register():
 
    form = RegisterForm(request.form)
    if form.validate():
        name     =  form.name.data 
        email    = form.email.data
        username = form.username.data
        password = form.password.data
        
    conn = sql.connect("database-name.db")
    cur = conn.cursor()
    cur.execute("INSERT INTO users(name,email,username,password) VALUES(?,?,?,?)", [name, email, username, password])
    conn.commit()
    conn.close()

  

أو يمكنك الحاق المعامل check_same_thread=False عند انشاء المحرك الخاص بقاعدة البيانات

engine = create_engine(
   'sqlite:///restaurantmenu.db',
   connect_args = {
      'check_same_thread': False
   }
)

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...