次の問題の原因を理解しようとするのは本当に頭痛の種です。以下のライブラリを組み合わせて使用しています。
- マルチスレッドでリクエストを処理するpyTelegramBotAPI
- SQL錬金術
- sqlite
SQLAlchemy
は最初に を使用していましたNullPool
が、現在は を使用するように構成されていますQueuePool
。また、次のイディオムを使用して、スレッドごとに新しい DB セッションを起動しています (私の理解によると)。
Session = sessionmaker(bind=create_engine(classes.db_url, poolclass=QueuePool))
@contextmanager
def session_scope():
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
@bot.message_handler(content_types=['document'])
def method_handler:
with session_scope() as session:
do_database_stuff_here(session)
それにもかかわらず、私はまだこの厄介な例外を受け取っています:(sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same thread
何か案は?;) 特に、別のトレッドが db 操作の間のどこかに入る可能性がある方法がわかりません...これがおそらく厄介な例外の理由です
更新 1 : を に変更するpoolclass
とSingletonThreadPool
、これ以上エラーが発生しないようです。ただし、のドキュメントにSQLAlchemy
よると、それは生産が蔓延しているわけではありません。