完全相同的mysql查询可以返回不同的结果

时间:2015-07-31 09:48:23

标签: python mysql

问题描述

我在一台服务器上运行以下python代码,访问另一台服务器上的mySQL数据库。到目前为止,我可以成功地查询数据库并在所有其他情况下获得正确的结果,但是一个查询返回了奇怪的结果,因此,转向调试我编写了以下代码:

    with closing(self.db.cursor()) as c:
        c.execute(myQuery, myParams)       
        self.logger.log("QUERY: %s" % (c._executed,))

myQuery持有有效的mySQL查询,myParams是3个整数的列表。 'logger'只是将我输入的内容写入文件。换句话说,此代码将准确捕获发送到mysql服务器的查询。将查询复制到所述服务器上的mySQL命令行或通过在该服务器上运行的phpmyadmin运行它得到1个结果。但是,运行(与'block'相同的第一个语句:

        results = c.fetchall()  
    self.logger.log("%s results" % (len(results),))

给我一​​个'0结果'的消息。

另一个有趣的消息:我使用这种模式迭代结果:

for row in results: 
        x = Foo(row[2])
        y = Bar(row[0], row[1], x)

我确认此模式实际上适用于另一个查询,但是查询的“较小”版本会导致问题,例如:这里实际上通过python在数据库中存储了有效数据的非零数量。该查询非常相似,但不完全相同。请参阅两个查询的“查询详细信息”部分

问题:

这怎么可能?

版本

SQL报告版本; 5.5.37-0 + wheezy1

Python报告版本:2.7.9。使用GCC 4.9.2。 linux2上

其他信息

使用过的python模块:

import mysql.connector, sys, os

查询详情

我无法提供确切的查询,但可以提供变量名称替换为a,b,c等的版本。

此查询返回无结果,何时应返回一些(例如,它会在控制台上返回结果)

SELECT A.a1, B.b1, B.ID 
FROM B 
INNER JOIN A ON A.a2 = B.ID 
INNER JOIN C ON B.ip & C.m = C.ip & C.m AND C.m < B.m
INNER JOIN D ON C.ID = D.d1
WHERE B.b2 = %s AND D.d2 = %s AND D.d3 = %s

此查询实际确实通过python以及控制台返回结果。请注意这几乎是完全相同的查询,有一个'join'被剥离并被其结果取代:

SELECT A.a1, B.b1, B.ID
FROM B
INNER JOIN A ON A.a2 = B.ID 
INNER JOIN C ON B.ip & C.m = C.ip & C.m AND C.m < B.m
WHERE C.ID = %s AND B.b2 = %s

类型如下:

<X>.ID: INT UNSIGNED for all <X> (primary key, indexed)
<X>.ip: INT UNSIGNED for all <X>
<X>.m: INT UNSIGNED for all <X>
A.a1: TINYTEXT
B.b1: SMALLINT UNSIGNED    
A.a2: INT UNSIGNED (fkey to B.ID, indexed)
D.d1: INT UNSIGNED (fkey to C.ID, indexed)
B.b2: SMALLINT UNSIGNED (fkey to F.ID, indexed)
D.d2: SMALLINT UNSIGNED (fkey to F.ID, indexed)
D.d3: INT UNSIGNED (fkey to E.ID, indexed)

0 个答案:

没有答案