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

خطأ SQLite objects can only be used in same thread في فلاسك Flask؟

Mohssen A Mohssen

السؤال

كنت أستعمل قواعد بيانات 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...