Python 3 psycopg2 Скопировать из стандартного ввода не удалось: ошибка в .read () - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь применить код, найденный на этой странице, в частности, в части «Копировать данные из итератора строк» ​​в оглавлении, но столкнулся с проблемой, связанной с моим кодом.

Поскольку не все строки, поступающие из генератора (здесь 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 и выдать ошибку, а не просто остановить?

...