我在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中创建的,这是线程ID 5740无无。
我提交后如何继续会话? TNX
答案 0 :(得分:12)
SQLite默认禁止在多个线程中使用单个连接。
只需将connect_args={'check_same_thread': False}
参数添加到engine
变量,例如
engine = create_engine('sqlite:///dir_graph.sqlite', connect_args={'check_same_thread': False}, echo=True)
默认情况下,
check_same_thread
为True
,只有创建的主题可能 使用连接。如果设置False
,则返回的连接可能是 跨多个线程共享。 使用多个线程时 相同的连接写操作应该由用户序列化 避免数据损坏。