2017-12-21 15 views
2

シンプルなセットアップ、Sqlaclhemyセッション、私はこのようになりますシンプルなTaskオブジェクト持って

を動作していないよう抹消:私は、データベースにインスタンスを追加しようとしています、そして、

# -*- coding: utf-8 -*- 
from sqlalchemy import Column, Integer, String, Text, DateTime, Float, func, ARRAY,ForeignKey 
from sqlalchemy.orm import relationship 
from . import Base 
import settings 
import config.customer 
import datetime 

class Task(Base): 
    __tablename__ = "task" 

    id = Column(Integer, primary_key=True) 
    value = Column(Integer) 

    def __init__(self, value): 
     self.value = value 

    @classmethod 
    def get_fake_task(cls): 
     return Task(10) 

を何らかの理由でセッションからそれを使用すると動作しません。

# -*- coding: utf-8 -*- 
import config 
import config.customer 
import config.task 
import datetime 

#config.Base.metadata.create_all(config.engine) 


FAKE_TASK = config.task.Task.get_fake_task() 


session1 = config.create_session() 
session1.add(FAKE_TASK) 
session1.commit() 
session1.close() 

session2 = config.create_session() 
session2.add(FAKE_TASK) 
session2.refresh(FAKE_TASK) 
FAKE_TASK.value = 999999 
print(FAKE_TASK.id) 
session2.merge(FAKE_TASK) 
session2.commit() 
session2.expunge_all() 
session2.close() 



print(FAKE_TASK.value) 

これはかなり簡単な設定で、私の他のプロジェットでは、このような問題はありませんでした。たぶん私は別の場所で間違っているのでしょうか?上記のスクリプトでは

一番最後に値を印刷しようとしたとき、私は次のエラーを取得する:ここで

sqlalchemy.orm.exc.DetachedInstanceError: Instance is not bound to a Session; attribute refresh operation cannot proceed

は、ベースの宣言と設定内の__init__.pyファイルでエンジンですモジュール:

from sqlalchemy.engine.url import URL 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
import settings 
from contextlib import contextmanager 

Base = declarative_base() 
engine = create_engine(URL(**settings.DATABASE), pool_size=0, max_overflow=-1) 
Session = sessionmaker(bind=engine) 

def create_session(): 
    session = Session() 
    return session 

はあなたの助け

答えて

0

expire_on_commitいただき、ありがとうございます= Falseの

一度コミットするとオブジェクトが期限切れにならないようにするには、セッションメーカーに10

が必要です。 プロパティにアクセスする前に期限切れのオブジェクトをデータベースからリフレッシュする必要があるため、セッションスコープ内にある必要があります。 期限切れにすることなく、セッションスコープからプロパティにアクセスできます。

Session = sessionmaker(bind=engine,expire_on_commit=False) 
関連する問題