2016-11-04 4 views
1

Python 2.7 라이브러리의 결과 인 데이터를로드하려고합니다. 즉, AWS Redshift 테이블에 대한 pg8000 쿼리입니다.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 안전 매개 변수화 (사용자를 대신하여 인용 처리)를 지원해야합니다. Python DB API 표준을 따르는 경우 https://www.python.org/dev/peps/pep-0249/#paramstyle 중 하나 여야합니다.

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에서 모두 수행하여 더욱 효율적으로 만들 수있는 것 같은데 : 같은 코드가 보일 것이다 -

내가 (http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries psycopg2)을 잘 알고있어 무엇을 사용. 초기 선택 쿼리가 올바른 열 이름 (예 : AS value_count)의 별칭이 될 수있는 4 개의 원하는 필드를 생성하는 경우 다음과 같은 구조로 쿼리를 수행 할 수 있습니다.

insert into my_schema.my_table_to_update (
    select date_column, value_1, value_2, value_count 
    from (your selection query here) 
);