2013-02-28 52 views
2

我在sqlite數據庫中有兩個簡單的表。ProgrammingError SQLAlchemy中的線程錯誤

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 = Node('Node1',1)瞭解sqlalchemy。在我完成session.commit()之後,嘗試另一個語句,例如n2 = Node('n2',1)我得到這個錯誤: sqlalchemy.exc.ProgrammingError :(編程錯誤)在一個線程中創建的SQLite對象只能用在同一個線程中。該對象是在線程ID 3932中創建的,是線程ID 5740無無。

如何在我完成提交後繼續會話? tnx

+1

錯誤是SQLite的驅動程序錯誤,它是什麼,它說,這是你不能使用兩個不同的線程的連接 - 有更多的故事在這裏,你究竟在這裏如何運行Session?有線程正在進行嗎? – zzzeek 2013-03-02 16:16:59

+0

沒有故意與線程。我在Spyder中運行此代碼。運行設置是在運行後與解釋器交互。這就是我所做的。它看起來像commit()關閉連接,然後我有重新初始化。我沒有在SQLalchemy文檔中找到excat提示。 – ArtDijk 2013-03-03 11:09:48

+0

嘗試在默認的Python解釋器中運行或作爲單個腳本運行。從來沒有聽說過「Spyder」,但它可能做線程奇怪的事情。 – zzzeek 2013-03-03 16:37:35

回答

3

SQLite默認禁止在多個線程中使用單個連接。 只需添加connect_args={'check_same_thread': False}參數到您的engine可變像

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