使用带有Twisted Python的MySQL.connector来执行多个查询

时间:2016-04-07 15:08:23

标签: python mysql twisted

我最近有一个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模块获取我知道的结果?

2 个答案:

答案 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"
    )