Redshift COPY CSV в S3 с использованием Python - PullRequest
0 голосов
/ 02 июля 2018

HI У меня есть следующая функция для сохранения файла CSV:

mysql_cur = mysql_conn.cursor()
mysql_cur.execute('select * from %s where Date > "2018-01-01";' % mysql_table_name  )
description = mysql_cur.description
rows = mysql_cur.fetchall()
for row in rows:
    c.writerow(row)

Затем я вручную загружаю файл в корзину S3.

Последний раз я запускал запрос COPY:

redshift_cur = redshift_conn.cursor()

sql = """copy kpi_kpireport from 's3://clab-migration/kpi.csv' 
credentials 'aws_access_key_id=ID;aws_secret_access_key=KEY/KEY/pL/KEY'
csv;"""
print(redshift_cur.execute(sql))

Команда COPY работает, когда я использую ее в SQL Workbench / J, я просто не уверен, что я делаю здесь неправильно с синтаксисом в операторе execute, который не копирует строки.

1 Ответ

0 голосов
/ 02 июля 2018

На самом деле причина, по которой вы не видите данные в Redshift, заключается в том, что вы не включили автоматическую фиксацию, следовательно, ваши команды выполнены успешно, но она copy передает данные в Redshift, но не фиксирует. Следовательно, вы не видите данные, когда вы select запрашиваете console или WorkBench/J.

Вы должны явно начать и совершить транзакцию. Я просто даю вам простой рабочий пример.

import psycopg2


def redshift():

    conn = psycopg2.connect(dbname='**_dev_**', host='888888888888****.u.****.redshift.amazonaws.com', port='5439', user='******', password='********')
    cur = conn.cursor();

    //Begin your transaction
    cur.execute("begin;")

    cur.execute("copy kpi_kpireport from 's3://clab-migration/kpi.csv' credentials 'aws_access_key_id=ID;aws_secret_access_key=KEY/KEY/pL/KEY' csv;")
    ////Commit your transaction
    cur.execute("commit;")
    print("Copy executed fine!")

redshift();

Теперь, если вы запустите код выше, вы увидите скопированные данные.

Если вы удалите две строки из приведенного выше кода, cur.execute("begin;"), cur.execute("commit;") запустите его, даже если он успешно выполнен без ошибок, вы не увидите данные в Redshift.

...