7

sqlite db に 2 つの単純なテーブルがあります。

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: (ProgrammingError) SQLite objects created in a thread can only be used in a thread同じスレッドです。オブジェクトはスレッド ID 3932 で作成され、これはスレッド ID 5740 です なし なし。

コミットを行った後、セッションを続行するにはどうすればよいですか? tnx

4

1 に答える 1