ProgrammingError在SQLAlchemy中的线程错误

问题描述 投票:4回答:1

我在sqlite db中有两个简单的表。

from sqlalchemy import MetaData, Table, Column, Integer, ForeignKey, \
    create_engine, String
from sqlalchemy.orm import mapper, relationship, sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///dir_graph.sqlite', echo=True)

session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
session = Session()

Base = declarative_base()

class NodeType(Base):
    __tablename__ = 'nodetype'
    id = Column(Integer, primary_key=True)
    name = Column(String(20), unique=True)
    nodes = relationship('Node', backref='nodetype')

def __init__(self, name):
    self.name = name

def __repr__(self):
    return "Nodetype: %s" % self.name


class Node(Base):
    __tablename__ = 'node'

    id = Column(Integer, primary_key=True)
    name = Column(String(20), unique=True)
    type_id = Column(Integer,
                 ForeignKey('nodetype.id'))


    def __init__(self, _name, _type_id):
        self.name = _name
        self.type_id = _type_id

Base.metadata.create_all(engine) 

在运行之后,我与解释器交互。例如n1 =节点('Node1',1)以了解sqlalchemy。在我做了session.com()并尝试另一个语句之后,例如n2 = Node('n2',1)我收到此错误:sqlalchemy.exc.ProgrammingError:(ProgrammingError)在一个线程中创建的SQLite对象只能在同一个线程中使用。该对象是在线程ID 3932中创建的,这是thread id 5740无无。

我提交后如何继续会话? TNX

sqlite sqlalchemy
1个回答
12
投票

SQLite默认禁止在多个线程中使用单个连接。只需将connect_args={'check_same_thread': False}参数添加到您的engine变量中即可

engine = create_engine('sqlite:///dir_graph.sqlite', connect_args={'check_same_thread': False}, echo=True)

sqlite3.connect说:

默认情况下,check_same_threadTrue,只有创建线程可以使用连接。如果设置False,则可以跨多个线程共享返回的连接。当使用具有相同连接的多个线程时,应由用户序列化写操作以避免数据损坏。

© www.soinside.com 2019 - 2024. All rights reserved.