Redshift вставить значения в таблицу

Я пытаюсь загрузить данные, которые являются результатом библиотеки Python 2.7 - запрос pg8000 к таблице AWS Redshift.

Сначала я запрашиваю таблицу Redshift для результатов, и она предоставляет их в кортеже, содержащем значения в списке.

Пример:

value_tuple = ([datetime.date(2016, 10, 2), 1, 1, 123123], [datetime.date(2016, 10, 2), 1, 2, 3131312])

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

Таблица, с которой я работаю, выглядит так:

| date_column | value_1 | value_2 | value_count | 
| 2016-10-01  |    1    |    2    |     300     |

Сначала я попытался создать запрос на обновление, который бы использовал только один список внутри кортежа.

update_query = """insert into my_schema.my_table_to_update
                       values %s
                       """ % str(value_tuple[0])

Таким образом, update_query становится:

'insert into my_schema.my_table_to_update\n                       values [datetime.date(2016, 10, 2), 1, 1, 123123]\n                       '

Когда я запускаю запрос на обновление таблицы, я получаю эту ошибку:

pg8000.core.ProgrammingError: (u'ERROR', u'42601', u'syntax error at or near "["', u'70', u'/home/rdsdb/padb/src/pg/src/backend/parser/parser_scan.l', u'699', u'yyerror', u'', u'')

Я думаю, это означает, что я не могу использовать формат списка результатов для вставки в таблицу.

Каков функциональный и желательно эффективный способ вставки этих данных в Redshift?

1 ответ

Я не знаком с pg8000, поэтому возьмите это с крошкой соли.

Последний запрос, который вы хотите выполнить, должен выглядеть примерно так:

INSERT INTO your_table (date_column, value_1, value_2, value_count) 
VALUES ('2016-10-02', 1, 2, 3131312);

Вы должны избегать интерполяции строк с SQL-запросами, так как это может открыть для вас инъекцию.

Ваша библиотека должна поддерживать собственную безопасную параметризацию SQL (которая также заботится о цитировании). Если он соответствует стандарту API Python DB, он должен быть одним из следующих: https://www.python.org/dev/peps/pep-0249/.

Используя то, с чем я знаком (psycopg2 - http://initd.org/psycopg/docs/usage.html) код будет выглядеть так:

update_query = """insert into my_schema.my_table_to_update 
        (date_column, value_1, value_2, value_count)
        VALUES (%s, %s, %s, %s);"""
cur.execute(update_query, value_tuple)

Похоже, что в вашем случае вы могли бы сделать это еще более эффективным, сделав все это в SQL. Если ваш начальный запрос выбора дает 4 желаемых поля, которые могут быть связаны с правильными именами столбцов (например: AS value_count), то вы можете выполнить запрос со структурой, подобной этой:

insert into my_schema.my_table_to_update (
    select date_column, value_1, value_2, value_count
    from (your selection query here)
);
Другие вопросы по тегам