通过Python批量检索MySQL数据

时间:2015-09-17 08:20:45

标签: python mysql

由于音量的原因,我想分批制作这个过程。

这是我的代码:

 getconn = conexiones()
 con = getconn.mysqlDWconnect()
 with con:
     cur = con.cursor(mdb.cursors.DictCursor)
     cur.execute("SELECT id, date, product_id, sales FROM sales")
     rows = cur.fetchall()

如何实现索引以批量获取数据?

4 个答案:

答案 0 :(得分:24)

第一点:python db-api.cursor是一个迭代器,所以除非你真的需要一次在内存中加载整批,你可以先从使用这个功能开始,即的:

cursor.execute("SELECT * FROM mytable")
rows = cursor.fetchall()
for row in rows:
   do_something_with(row)

你可以:

cursor.execute("SELECT * FROM mytable")
for row in cursor:
   do_something_with(row)

然后,如果你的数据库连接器的实现仍然没有正确使用这个功能,那么是时候添加LIMIT和OFFSET了:

cursor.execute("SELECT count(*) FROM mytable")
count = cursor.fetchone()[0]
batch_size = 42 # whatever

for offset in xrange(0, count, batch_size):
    cursor.execute(
        "SELECT * FROM mytable LIMIT %s OFFSET %s", 
        (batch_size, offset))
   for row in cursor:
       do_something_with(row)

答案 1 :(得分:4)

您可以使用

SELECT id, date, product_id, sales FROM sales LIMIT X OFFSET Y;

其中X是您需要的批量大小,Y是当前偏移量(例如,X倍当前迭代次数)

答案 2 :(得分:0)

要扩展akalikin的答案,您可以使用步进式迭代将查询拆分为块,然后使用LIMIT和OFFSET执行查询。

cur = con.cursor(mdb.cursors.DictCursor)
cur.execute("SELECT COUNT(*) FROM sales")

for i in range(0,cur.fetchall(),5):
    cur2 = con.cursor(mdb.cursors.DictCursor)
    cur2.execute("SELECT id, date, product_id, sales FROM sales LIMIT %s OFFSET %s" %(5,i))
    rows = cur2.fetchall()
    print rows

答案 3 :(得分:0)

谢谢,这是我如何实施它的建议:

control = True
index = 0
while control==True:
   getconn = conexiones()
   con = getconn.mysqlDWconnect()
   with con:
        cur = con.cursor(mdb.cursors.DictCursor)
        query = "SELECT id, date, product_id, sales FROM sales  limit 10 OFFSET " + str(10 * (index))
        cur.execute(query)
        rows = cur.fetchall()
        index = index+1        
        if len(rows)== 0:
            control=False
   for row in rows:
        dataset.append(row)