问题描述
我在一台服务器上运行以下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)