【问题标题】:How to fix '(sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same thread.' Issue?如何修复“(sqlite3.ProgrammingError)在线程中创建的SQLite对象只能在同一个线程中使用。”问题?
【发布时间】:2019-10-30 14:03:17
【问题描述】:

我正在使用 Flask 和 SqlAlchemy。当我尝试运行我的网站时,我为 SqlAlchemy 创建的数据库似乎搞砸了,并且会弹出错误消息,指出存在线程错误。我想知道是不是因为我没有从以前的模式中删除我的表。我正在使用 linux 服务器尝试运行“python3”和文件来设置我的数据库。

我试图从我的本地驱动器中物理删除该表并重新运行它,但我仍然出现此错误。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session
from database_setup import Base, Category, Item

engine = create_engine('sqlite:///database_tables.db')
Base.metadata.bind = engine

Session = sessionmaker()
Session.bind = engine
session = Session()

brushes = Category(id = 1, category_name = 'Brushes')
session.add(brushes)
session.commit()


pencils = Category(id = 2, category_name = 'Pencils')
session.add(pencils)
session.commit()

当我使用 Flask 处于调试模式时,我单击了使用这些行创建的链接,但在单击三下后我得到了错误

"(sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140244909291264 and this is thread id 140244900898560 [SQL: SELECT category.id AS category_id, category.category_name AS category_category_name FROM category] [parameters: [{}]] (Background on this error at: http://sqlalche.me/e/f405)"

【问题讨论】:

  • 我知道它没有回答你的问题,但你看过Flask-SQLalchemy吗?它旨在为您处理其中一些场景。
  • 我还没看。我一定会读一读,非常感谢。
  • 否则,AFAIK,您可能只需要使用scoped_session 而不是Session()session = scoped_session(Session)
  • 我试试看,谢谢。

标签: python multithreading sqlite flask sqlalchemy


【解决方案1】:

您可以为每个线程使用一个会话,方法是使用线程 ID _thread.get_ident() 对它们进行索引:

import _thread

engine = create_engine('sqlite:///history.db', connect_args={'check_same_thread': False})

...
Base.metadata.create_all(engine)
sessions = {}
def get_session():
    thread_id = _thread.get_ident() # get thread id
    if thread_id in sessions:
        return sessions[thread_id]

    session_factory = sessionmaker(bind=engine)
    Session = scoped_session(session_factory)
    sessions[thread_id] = Session()
    return sessions[thread_id]

然后根据您的情况在需要的地方使用get_session()

get_session().add(brushes)
get_session().commit()

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2018-06-21
    • 2021-09-20
    • 2020-09-12
    • 2017-03-01
    • 2019-10-21
    • 2016-03-04
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多