4

次の問題の原因を理解しようとするのは本当に頭痛の種です。以下のライブラリを組み合わせて使用​​しています。

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 : を に変更するpoolclassSingletonThreadPool、これ以上エラーが発生しないようです。ただし、のドキュメントにSQLAlchemyよると、それは生産が蔓延しているわけではありません。

4

2 に答える 2