我正在尝试加载数据,这是Python 2.7库的结果 - 针对AWS Redshift表的pg8000查询。
首先,我在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变为:
'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的有效且优选有效的方法是什么?
答案 0 :(得分:2)
我对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)
);