0

私はテーブルを持っていて、オブジェクトリストを入力してから、それらの ID を使用する必要がありますが、取得しています

インスタンス <location at 0x457f3b0> はセッションにバインドされていません。属性の更新操作を続行できません

エラー。

リストにオブジェクトを入力し、それを関数に送信して一度に挿入します。次に、ID を使用しようとします。

ここに私のすべての挿入機能があります:

def insertlocations(locationlist):
    session.add_all(locationlist)
    session.commit()
    session.close()

次に、ID を取得しようとします。

insertlocations(neighbourhoodlist)
session.flush(neighbourhoodlist)
for neighbourhood in neighbourhoodlist:
    print neighbourhood.locationid

ところで、セッションはグローバルです。さらに情報が必要ですか?

MySQL テーブルを見ると、データが挿入されています。

4

1 に答える 1

0

ほとんどの場合、問題は関数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() は不要です。
于 2012-10-07T11:22:03.193 に答える