 <p>So far by looking at the source of of pysqlite, I can say that it is not possible to share connection or cursor objects (see <code>pysqlite_check_thread</code> function usage) only. </p> <p><code>pysqlite_check_thread</code> function raises <code>ProgrammingError</code> exception with that message </p> <pre><code>SQLite objects created in a thread can only be used in that same thread. </code></pre> <p>Some function in your source code catches that exception and prints it.</p> <p>In order to find places in your source code that call connection methods in other threads, I would suggest to write call wrapper over connection object something like this:</p> <pre><code># script name: sqllitethread.py import inspect import sqlite3 import threading import thread from sqlite3 import ProgrammingError class CallWrapper(object): def __init__(self, obj): self.obj = obj self.main_thread_id = thread.get_ident() def __getattr__(self, name): if self.main_thread_id != thread.get_ident(): print "Thread %s requested `%s` attribute from %s" % (thread.get_ident(), name, self.obj) for frame in inspect.getouterframes(inspect.currentframe())[1:]: if frame[1].endswith('threading.py'): continue print "\t", "%s:%s" % (frame[1], frame[2]), frame[3], frame[4][0].strip() return getattr(self.obj, name) conn = CallWrapper(sqlite3.connect('example.db')) c = conn.cursor() def worker(): try: conn.execute('.tables') except ProgrammingError, e: print e t = threading.Thread(target=worker) t.start() t.join() </code></pre> <p>Output example:</p> <pre><code>Thread 140390877370112 requested `execute` attribute from &lt;sqlite3.Connection object at 0x7faf4e659858&gt; sqllitethread.py:30 worker conn.execute('.tables') SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140390912665408 and this is thread id 140390877370112 </code></pre>