ほとんどの場合、問題は関数close()
内に既にセッションがあることですinsertlocations()
。
次に にアクセスするneighbourhood.locationid
と、セッションが閉じられ、そのneighbourhood
オブジェクトはセッションにバインドされなくなります。
たとえば、これはうまくいくはずです:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///example.db')
engine.echo = True
Base = declarative_base()
class Location(Base):
__tablename__ = 'locations'
locationid = Column(Integer, primary_key=True)
name = Column(String)
address = Column(String)
def __init__(self, name, address):
self.name = name
self.address = address
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
def insertlocations(locationlist):
session.add_all(locationlist)
session.commit()
loc1 = Location('loc1', 'Foostreet 42')
loc2 = Location('loc2', 'Barstreet 27')
neighbourhoodlist = [loc1, loc2]
insertlocations(neighbourhoodlist)
for neighbourhood in neighbourhoodlist:
print neighbourhood.locationid
session.close()
- 関数から移動
session.close()
し、そのセッションの使用が終わった後に実行します。
- オブジェクトを追加するときにすでにセッションをコミットしているため、session.flush() は不要です。