Я пытаюсь загрузить в промежуточную базу данных файл журнала в форме:
56.33.95.60 7916545 abdou23 2018-10-14 00:00:00 GET/HTTP/1.0 200 214804 \{rtve.es}\ \{Mozilla/5.0 (*Linux*Android?4.2*AP-106 Build/*) applewebkit* (*khtml*like*gecko*)*Chrome/*Safari/* OPR/15*}\
244.176.163.127 3372323 venuto89 2014-10-04 13:00:00 POST/HTTP/1.0 200 307886 \{aboutads.info}\ \{Mozilla/5.0 (Mobile; *rv:47.0*)*Gecko*Firefox/47.0*}\
68.161.164.71 1872720 owens50 2019-08-05 11:00:00 POST/HTTP/1.0 202 363106 \{xbox.com}\ \{Mozilla/5.0 (*Linux*Android?4.2*Micromax A77 Build/*) applewebkit* (*khtml*like*gecko*) UCBrowser/9.7* U3/* Safari/*}\
5.84.12.253 1045005 parkison48 2019-01-28 15:00:00 POST/HTTP/1.0 200 365454 \{cnbc.com}\ \{Mozilla/5.0 (iPhone*CPU iPhone OS * like Mac OS X*) applewebkit* (*khtml*like*gecko*) Mobile/* NAVER(* 7.6.*)}\
Проблема, с которой я столкнулся, заключается в следующем
value too long for type character varying(100000)
CONTEXT: COPY logs, line 1, column log_string:
Это связано с тем, что код объединяет все строки в одну строку.
Я пытался использовать
COPY logs FROM STDIN WITH DELIMITER AS E'\n'
Я также пробовал / r и / t. И измените формат ФАЙЛА на CSV.
Ошибка вывода
COPY delimiter cannot be newline or carriage return
И код Python
def load_logs():
conn = PostgresHook(postgres_conn_id=db).get_conn()
cur = conn.cursor()
SQL_STATEMENT = """
COPY logs FROM STDIN WITH DELIMITER AS E'\n'
"""
with open('logfile.csv', 'r') as f:
cur.copy_expert(SQL_STATEMENT, f)
conn.commit()
Кроме того, стоит отметить, что python код работает как Dag в Airflow.py