Điểm đầu tiên:một con trăn db-api.cursor
là một trình lặp, vì vậy trừ khi bạn thực sự cần để tải toàn bộ hàng loạt trong bộ nhớ cùng một lúc, bạn chỉ có thể bắt đầu bằng cách sử dụng tính năng này, tức là thay vì:
cursor.execute("SELECT * FROM mytable")
rows = cursor.fetchall()
for row in rows:
do_something_with(row)
bạn chỉ có thể:
cursor.execute("SELECT * FROM mytable")
for row in cursor:
do_something_with(row)
Sau đó, nếu việc triển khai trình kết nối db của bạn vẫn không sử dụng đúng tính năng này, thì đã đến lúc thêm LIMIT và OFFSET vào hỗn hợp:
# py2 / py3 compat
try:
# xrange is defined in py2 only
xrange
except NameError:
# py3 range is actually p2 xrange
xrange = range
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)