我最近有一个Python 2.7x项目,我需要使用mysql.connector在一个查询中执行多个分号描述的语句。这在post.中很好地解释了。
但是,我需要将mysql.connector与Twisted一起用于我当前的项目,这意味着使用Twisted的优秀enterprise.adbapi模块使我的新阻塞数据库连接无阻塞。
config = {“user”:username,“password”:password,“host”:hostname, “database”:database_name,“raise_on_warnings”:True} cp = adbapi.ConnectionPool(“mysql.connector”,** config)
我的测试语句定义如下。我很抱歉他们是一个无聊的例子,但我知道我期望的结果,并且应该足以证明我得到了多个陈述的结果。
statement1 = "SELECT * FROM queue WHERE id = 27;" statement2 = "SELECT * FROM order WHERE id = 1;" statement_list = [statement1, statement2] statements = " ".join(statement_list)
当我现在尝试执行ConnectionPool方法.runQuery()
时出现问题def _print_result(result): if result: print("this is a result") print(result) else: print("no result") reactor.stop() d = cp.runQuery(statements, multi=True) d.addBoth(_print_result)
这让我得到以下结果:
这是一个结果[失败实例:回溯::没有结果集来取自。
如何使用Twisted的adbapi模块获取我知道的结果?
答案 0 :(得分:0)
因此,事实证明,当使用adbapi.ConnectionPool.runQuery()时,默认行为是将数据库询问的结果发送到cursor.fetchall()方法。但是,当使用mysql.connector时,这不起作用,即使没有扭曲。相反,我们需要迭代结果集,并在集合的每个成员上调用fetchall()。
所以,我解决这个问题的方法是使用以下子类。
来自twisted.enterprise import adbapi
类NEWadbapiConnectionPool(adbapi.ConnectionPool):
$scope.$on("update_chart_controller", function(event, args) { $scope.data = [args.fb.length, args.tw.length]; });
现在我创建以下内容:
def __init__(self, dbapiName, *connargs, **connkw): adbapi.ConnectionPool.__init__(self, dbapiName, *connargs, **connkw) def runMultiQuery(self, *args, **kw): return self.runInteraction(self._runMultiQuery, *args, **kw) def _runMultiQuery(self, trans, *args, **kw): result = trans.execute(*args, **kw) result_list = [] for item in result: if item.with_rows: result_list.append(item.fetchall()) return result_list
并获取每个陈述的结果列表。
我希望其他人觉得这很有用。
答案 1 :(得分:0)
RunQuery始终期望结果。正确的方法是调用runOperation(),它不会获取结果。
如果要使用.runQuery,则期望获取结果,因此您需要返回一些内容
dbpool.runQuery(
"UPDATE something SET col1=true WHERE some_id=123 RETURNING *"
)
.runOperation不会获得结果
dbpool.runOperation(
"UPDATE something SET col1=true WHERE some_id=123"
)