Пара вещей
Почему вы дважды перебираете ProductInventory?
Разве не должен произойти вызов executemany
после того, как вы собрали все tuple_of_tuples или их партию?
В документации pyodb c сказано, что «запуск executemany () с fast_executemany = False обычно не будет намного быстрее, чем прямой запуск нескольких команд execute ()». Поэтому вам нужно установить cursor.fast_executemany=True
в обоих примерах (см. https://github.com/mkleehammer/pyodbc/wiki/Cursor для более подробной информации / примеров). Я не уверен, почему это опущено в примере 2.
Вот пример того, как вы можете достичь sh того, что, я думаю, вы пытаетесь сделать. math.ceil
и условное выражение в end_idx = ...
учитывают последний пакет, который может быть нечетного размера. Итак, в приведенном ниже примере у вас есть 10 строк и размер пакета 3, так что вы получите 4 пакета, последний из которых имеет только один кортеж.
import math
df = ProductInventory
batch_size = 500
num_batches = math.ceil(len(df)/batch_size)
for i in range(num_batches):
start_idx = i * batch_size
end_idx = len(df) if i + 1 == num_batches else start_idx + batch_size
tuple_of_tuples = tuple(tuple(x) for x in df.iloc[start_idx:end_idx, :].values.tolist())
cursor.executemany("INSERT INTO table ([x]],[Y]) values (?,?)", tuple_of_tuples)
Пример вывода:
=== Executing: ===
df = pd.DataFrame({'a': range(1,11), 'b': range(101,111)})
batch_size = 3
num_batches = math.ceil(len(df)/batch_size)
for i in range(num_batches):
start_idx = i * batch_size
end_idx = len(df) if i + 1 == num_batches else start_idx + batch_size
tuple_of_tuples = tuple(tuple(x) for x in df.iloc[start_idx:end_idx, :].values.tolist())
print(tuple_of_tuples)
=== Output: ===
((1, 101), (2, 102), (3, 103))
((4, 104), (5, 105), (6, 106))
((7, 107), (8, 108), (9, 109))
((10, 110),)