如何解决'(sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same th



我正在使用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)"

您可以使用线程 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()

相关内容

最新更新