Получение данных из MySQL пакетами через Python
Я хотел бы сделать этот процесс партиями из-за объема.
Здесь мой код:
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()
Как я могу реализовать индекс для извлечения данных в пакетах?
Ответы
Ответ 1
Первая точка: 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)
Тогда, если ваша реализация соединителя db по-прежнему не использует эту функцию, пришло время добавить 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)
Ответ 2
Вы можете использовать
SELECT id, date, product_id, sales FROM sales LIMIT X OFFSET Y;
где X - размер требуемой партии, а Y - смещение по току (например, X-число текущих итераций)
Ответ 3
Чтобы расширить ответ на 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
Ответ 4
Спасибо, вот как я его реализую с вашими предложениями:
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)
Ответ 5
Если у вас большие данные, то вы не можете использовать лимит со смещением. Он очень медленный, потому что подсчитывает все строки и затем пропускает смещение. Если вы это время ожидания может произойти.