我正在尝试在Python中使用MySQLDB进行简单的获取操作。
我有两个表(Accounts和Products)。我需要查询Accounts表,获取acc_id并使用它来查询Products表。
Products表有超过10行。但是当我运行此代码时,每次运行它都会随机返回0至6行。
以下是代码片段:
奇怪的是,我试图使用调试器(PyDev on Eclipse)逐步执行代码,它正确获取了所有行(变量'keys'中存储的值以及控制台输出都是正确的)。
我确定我的数据库数据是正确的,因为我在MySQL控制台上运行了相同的SQL并得到了正确的结果。
为了确保我没有错误地关闭连接,我尝试使用
我看了一下RTM,但是里面没有太多有助于解决这个问题的信息。
我错在哪里?
谢谢。 编辑:我现在注意到另一个奇怪的事情。在这一行中
我有两个表(Accounts和Products)。我需要查询Accounts表,获取acc_id并使用它来查询Products表。
Products表有超过10行。但是当我运行此代码时,每次运行它都会随机返回0至6行。
以下是代码片段:
# Set up connection
con = mdb.connect('db.xxxxx.com', 'user', 'password', 'mydb')
# Create cursor
cur = con.cursor()
# Execute query
cur.execute("SELECT acc_id FROM Accounts WHERE ext_acc = '%s'" % account_num ) # account_num is alpha-numberic and is got from preceding part of the program
# A tuple is returned, so get the 0th item from it
acc_id = cur.fetchone()[0]
print "account_id = ", acc_id
# Close the cursor - I was not sure if I can reuse it
cur.close()
# Reopen the cursor
cur = con.cursor()
# Second query
cur.execute("SELECT * FROM Products WHERE account_id = %d" % acc_id)
keys = cur.fetchall()
print cur.rowcount # This prints incorrect row count
for key in keys: # Does not print all rows. Tried to directly print keys instead of iterating - same result :(
print key
# Closing the cursor & connection
cur.close()
con.close()
奇怪的是,我试图使用调试器(PyDev on Eclipse)逐步执行代码,它正确获取了所有行(变量'keys'中存储的值以及控制台输出都是正确的)。
我确定我的数据库数据是正确的,因为我在MySQL控制台上运行了相同的SQL并得到了正确的结果。
为了确保我没有错误地关闭连接,我尝试使用
with con
而不是手动关闭连接,但结果是一样的。我看了一下RTM,但是里面没有太多有助于解决这个问题的信息。
我错在哪里?
谢谢。 编辑:我现在注意到另一个奇怪的事情。在这一行中
cur.execute("SELECT * FROM Products WHERE account_id = %d" % acc_id)
,我硬编码了acc_id的值,即使它成为了cur.execute("SELECT * FROM Products WHERE account_id = %d" % 322)
,它返回了所有行。
fethall()
是一个东西吗?fet*c*hall()
呢?这有什么区别吗?另外,您说表格有超过10行......您是否考虑了您的where子句? - Colleencur.execute("SELECT * FROM Products WHERE account_id = %d" % acc_id)
,我硬编码了acc_id的值,即将其设为cur.execute("SELECT * FROM Products WHERE account_id = %d" % 322)
,它返回所有行。 - Bharat(acc_id)
不是一个元组,它只是和acc_id
一样的东西。如果你想要一个包含一个元素的元组,你需要加上逗号,就像我上面的例子中写的那样:(acc_id,)
。另外,你在这里根本不应该使用%
。 - abarnert