2016-11-04 7 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]) 

私は別のテーブルにこれらの値を挿入したいのですが、INSERT文を作成し、いくつかの問題に実行しています。私はすべての値を個別に挿入することはできますが、むしろすべてを一度に行うことになります。

私はこのようになりますで働いているテーブル:

| 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の内側に1つだけのリストを使用する更新クエリを作成しようとしました

'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のいずれかになります。私は(psycopg2 - http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries)に精通してるものを使用して

コードは次のようになります。あなたのケースであなたはそれがさらに効率的なSQLでそれをすべて行うことによって作ることができるように

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) 

が鳴ります。最初の選択クエリで、適切な列名(たとえば、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) 
); 
関連する問題