试图了解以下问题的原因,我真的很头疼。我们正在使用以下库的组合:
- pyTelegramBotAPI以多线程方式处理请求
- SQL炼金术
- sqlite
SQLAlchemy
最初使用,现在NullPool
配置为使用QueuePool
. 我还使用以下成语为每个线程启动一个新的数据库会话(根据我的理解)
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
有任何想法吗?;) 特别是,我不明白另一个胎面如何可能在数据库操作之间的某个地方......这可能是讨厌的异常的原因
更新 1:如果我将 更改poolclass
为SingletonThreadPool
,那么似乎不会再出现错误。然而,文档SQLAlchemy
告诉它不是生产盛行。