Я пытаюсь применить код, найденный на этой странице, в частности, в части «Копировать данные из итератора строк» в оглавлении, но столкнулся с проблемой, связанной с моим кодом.
Поскольку не все строки, поступающие из генератора (здесь log_lines), могут быть импортированы в базу данных PostgreSQL, я пытаюсь отфильтровать правильные строки (здесь строка), используя itertools.filterfalse, как в кодовом блоке ниже:
def copy_string_iterator(connection, log_lines) -> None:
with connection.cursor() as cursor:
create_staging_table(cursor)
log_string_iterator = StringIteratorIO((
'|'.join(map(clean_csv_value, (
row['date'],
row['time'],
row['cs_uri_query'],
row['s_contentpath'],
row['sc_status'],
row['s_computername'],
...
row['sc_substates'],
row['s_port'],
row['cs_version'],
row['c_protocol'],
row.update({'cs_cookie':'x'}),
row['timetakenms'],
row['cs_uri_stem'],
))) + '\n')
for row in filterfalse(lambda line: "#" in line.get('date'), log_lines)
)
cursor.copy_from(log_string_iterator, 'log_table', sep = '|')
Когда я запускаю это, cursor.copy_from () выдает мне следующую ошибку:
QueryCanceled: COPY from stdin failed: error in .read() call
CONTEXT: COPY log_table, line 112910
Я понимаю, почему эта ошибка происходит, потому что в тестовом файле, который я там использую только 112909 строк, которые соответствуют условию filterfalse. Но почему он пытается скопировать строку 112910 и выдать ошибку, а не просто остановить?