2014-09-01 89 views
0

我在bottle.py上有應用程序。這個應用程序通過sqlalchemy與MySQL一起工作。開始版本我是簡單的定義會話並提交。在sqlalchemy中查詢結果錯誤ZopeTransactionExtension

engine = create_engine(SQLALCHEMY_DATABASE_URI) 
Session = sessionmaker(bind=engine) 

session = Session() 

class Message(Base): 
    __tablename__ = 'messages' 
    id = Column(Integer, primary_key=True) 
    type = Column(String(30), index=True) 
    text = Column(Text, default='') 

    def add_message(self, data_message): 
    new_message = Message(
     type=data_message.get('type'), 
     text=data_message.get('text'), 
     status=1 
    ) 

    session.add(new_message) 
    session.commit() 

    return new_message 

    def get_messages(self) 
    messages = session.query(Message)\ 
         .filter_by(type='sms', status=1)\ 
         .order_by(Message.create_datetime)\ 
         .all()[0:int(offset)] 
    return messages 

所有的工作都很好。但在導致mysql連接錯誤,連接中斷和重複回滾錯誤。 我用zope.transaction更改我的代碼。

engine = create_engine(SQLALCHEMY_DATABASE_URI) 
Session = scoped_session(sessionmaker(bind=engine, extension=ZopeTransactionExtension(), expire_on_commit=False)) 

class Message(Base): 
    __tablename__ = 'messages' 
    id = Column(Integer, primary_key=True) 
    type = Column(String(30), index=True) 
    text = Column(Text, default='') 

    def add_message(self, data_message): 
    new_message = Message(
     type=data_message.get('type'), 
     text=data_message.get('text'), 
     status=1 
    ) 

    session = Session() 
    with transaction.manager: 
     session.add(new_message) 
     transaction.commit() 

    return new_message 

    def get_messages(self) 
    session = Session() 
    messages = session.query(Message)\ 
         .filter_by(type='sms', status=1)\ 
         .order_by(Message.create_datetime)\ 
         .all()[0:int(offset)] 
    return messages 

在這種情況下,回滾帶來的錯誤。但是,在查詢中,get消息就像'cache'一樣工作。對於第一個查詢,所有結果都是正確的,但繼續我手動更改MySQL中的字段「狀態」,並且不會收到我的消息。只有空列表。 我嘗試在函數中定義'session'之後嘗試ZopeTransactionExtension('changed'),mark_changed(session)。

寫信給我回答問題。謝謝。

回答

0

解決方案對我來說,包裝查詢在 '與tansaction.manager':

with transaction.manager: 
    messages = session.query(Message)\ 
        .filter_by(type='sms', status=1)\ 
        .order_by(Message.create_datetime)\ 
        .all()[0:int(offset)]