If you create your database in a thread – usually the main thread – and try to use it in another thread your will get:
ProgrammingError: SQLite objects created in a thread can only be used in that
same thread.The object was created in thread id SOME_ID and this is thread
id SOME_ID
This is because you created the ‘cursor’ object in the main thread, if you for example create only the connection object in the main thread and create ‘cursor’s when you want to query the database, your problem will be solved.
Of course you must take care of the concurrency issues that you might have but other than that, you could do something like this:
import sqlite3 class datastore: def __init__(self): self.data_file = 'path_to_db_file' def connect(self): self.conn = sqlite3.connect(self.data_file) return self.conn.cursor() def disconnect(self): self.cursor.close() def free(self, cursor): cursor.close() def write(self, query, values = ''): cursor = self.connect() if values != '': cursor.execute(query, values) else: cursor.execute(query) self.conn.commit() return cursor def read(self, query, values = ''): cursor = self.connect() if values != '': cursor.execute(query, values) else: cursor.execute(query) return cursor
This will fix the issue, it creates cursors for each query and returns it to the caller, the only thing is that you must ‘close’ the cursor when you are done with it. Here I have a member function ‘free’. (probably because of my PHP brain damage)
I hope this helps…
Hamid Alipour is a partner in Codehead, LLP with his wife, Tess. Hamid speaks 12 markup and programming languages [Yes, 12: PHP, CSS, Ajax, JavaScript, HTML/XHTML, Java, Python, C/C++, ASP, Visual Basic, Scheme and Action Script]; has a penchant for solving the unsolvable; an affinity for clean, hand-written code and is a Zend Certified 