2016-11-04 76 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

使用的是什麼我很熟悉(psycopg2 - http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries)的代碼是這樣:

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) 
);