由于音量的原因,我想分批制作这个过程。
这是我的代码:
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()
如何实现索引以批量获取数据?
答案 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)