sqlalchemy ZopeTransactionExtension中的查询结果错误

时间:2014-09-01 10:16:22

标签: python mysql transactions sqlalchemy bottle

我在bottle.py上有应用程序。此应用程序通过sqlalchemy与MySQL一起使用。启动版本我很简单定义会话并执行提交。

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

在这种情况下错误与回滚。但是,在查询中,获取消息的工作方式与“缓存”类似。对于第一个查询,所有结果都正确,但继续我手动更改MySQL中的字段'status',不要收到我的消息。只有空列表。 我在函数中定义'session'后尝试ZopeTransactionExtension('changed'),mark_changed(session)。

写信给我。谢谢。

1 个答案:

答案 0 :(得分:0)

解决方案,我在'with transaction.manager'中包装查询:

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