我在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)。
写信给我。谢谢。
答案 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)]