python+;sqlalchemy:在循环中调用存储过程
我有一个python脚本,它定期查询mysql数据库中的数据(使用sqlalchemy 0.7.4)。它通过运行存储过程来实现。如果过程返回任何内容,脚本将尝试处理数据(此部分与数据库无关),然后使用第二个过程将结果保存回数据库 在此之后,它将睡眠一段时间(通常是一分钟),然后再次进入睡眠状态,直到停止。它应该可以运行数周 我经常会遇到这样的错误:“在回滚无效事务之前无法重新连接”。我已经使用我能找到的各种信息进行了一些更改,我想知道这是否是实现我想要的目标的好方法:python+;sqlalchemy:在循环中调用存储过程,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我有一个python脚本,它定期查询mysql数据库中的数据(使用sqlalchemy 0.7.4)。它通过运行存储过程来实现。如果过程返回任何内容,脚本将尝试处理数据(此部分与数据库无关),然后使用第二个过程将结果保存回数据库 在此之后,它将睡眠一段时间(通常是一分钟),然后再次进入睡眠状态,直到停止。它应该可以运行数周 我经常会遇到这样的错误:“在回滚无效事务之前无法重新连接”。我已经使用我能找到的各种信息进行了一些更改,我想知道这是否是实现我想要的目标的好方法: from sqlalche
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):
query = 'call sp_get_files(%d)'%user_id
result = self._session.execute(query).fetchall()
return result
如果这会生成相同的异常,那么发布完整的堆栈跟踪将非常有用。例外是朋友,而不是对手 我会尝试给你堆栈跟踪,但这种情况偶尔发生,我不能总是复制它。我还有一个关于存储过程的问题,但我认为这更适合一个新问题。如果是零星的问题,我会仔细查看MySQL日志。
def sp_test_1(self, user_id):
query = 'call sp_get_files(%d)'%user_id
result = self._session.execute(query).fetchall()
return result