Я часто делаю что-то похожее на приведенное ниже, что позволяет мне загружать умеренное количество строк с прерывистыми фиксациями, чтобы ускорить процесс. Если у меня много строк, конечно, я смотрю на альтернативные маршруты, такие как массовые загрузчики и т. Д.
import psycopg2
fake_row = ["a","b","c"]
rows = [fake_row] * 100
rows_inserted = 0
commit_interval = 10
with psycopg2.connect("host=localhost") as conn, \
conn.cursor() as cur:
conn.autocommit = False
for row in rows:
cur.execute("insert into table (%s, %s, %s)", row)
rows_inserted += 1
if rows_inserted % commit_interval == 0:
conn.commit()
logging.info("I commit %s rows", rows_inserted)
logging.info("I am done at %s rows", rows_inserted)
conn.commit()
Теперь я рассматриваю варианты того, как это могло бы быть, если бы rows
был итератором или очередью, что-то вроде погружения моего пальца в проект потокового приложения. Может быть, это служба отдыха, которая ожидает ввода, или служба, потребляющая очередь kafka. Когда он его получает, загружает строку.
Я могу получить 1000 строк одновременно; Или я могу получить один, а затем бездействовать в течение 10 минут.
То, что я хочу сделать, это что-то вроде коммит каждые 10 строк или каждые 10 секунд ... в зависимости от того, что наступит раньше. Я предпочел бы иметь более высокий уровень фиксации по соображениям производительности, но если я получу только 1/2 пакета фиксации, я не хочу оставлять свое соединение незафиксированным и открывать себя для проблем с блокировкой базы данных.
Как правильно думать об этом? Я предполагаю, что мог бы придумать что-нибудь с асинхронностью, таймерами, расписанием, может быть, сепом но я не уверен, что это будет самый чистый / самый простой / надежный.
Любые советы приветствуются.