我有一个 python 脚本,它定期查询 mysql 数据库中的数据(使用 sqlalchemy 0.7.4)。它通过运行存储过程来实现。如果过程返回任何内容,脚本将尝试处理数据(这部分与 DB 无关),然后使用第二个过程将结果保存回来。
在此之后,它会休眠一段时间(通常是一分钟),然后再次休眠直到停止。它应该能够运行数周。
我经常会收到这个错误:“在回滚无效事务之前无法重新连接”。我已经使用我能找到的各种信息进行了一些更改,我想知道这是否是实现我想要的好方法:
from sqlalchemy import create_engine, exc
from sqlalchemy.orm import sessionmaker
from sqlalchemy import text, func
import time
class StoredProcedures():
_engine = None
_connection = None
_session = None
def __init__(self, cs):
self._engine = create_engine(cs, encoding='utf-8', echo=False, pool_recycle=600)
self._connection = self._engine.connect()
Session = sessionmaker(bind=self._engine)
self._session = Session()
def sp_test_1(self, user_id):
t = self._session.begin(subtransactions=True)
try:
query = 'call sp_get_files(%d)'%user_id
result = self._session.execute(query).fetchall()
t.close()
return result
except exc.DBAPIError, e: #Proper way of reconnecting?
t.rollback()
time.sleep(5)
self._connection = self._engine.connect()
Session = sessionmaker(bind=self._engine)
self._session = Session()
except:
t.rollback()
return None
cs = "mysql://test:test@127.0.0.1/test_db"
db_stored_procedures = StoredProcedures(cs)
while (True):
files = db_stored_procedures.sp_test_1(1)
if len(files) > 0:
print "This is where processing happens"
#And this is where the second procedure would be called to store the results
time.sleep(15)
我已经对此进行了测试,但我几乎只是写了它,所以我没有进行任何长期测试。我想先听听你的意见。
编辑: 最初我使用连接来执行查询,就像这样(省略了与上述脚本相同的大部分脚本):
def sp_test_1(self, user_id):
t = self._connection.begin()
try:
query = 'call sp_get_files(%d)'%user_id
result = self._connection.execute(query).fetchall()
t.close()
return result
except exc.DBAPIError, e:
#same as above
except:
t.rollback()
return None