红移插入值到表中



我正在尝试加载数据,这是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_updaten                       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'')

我认为这意味着我不能使用列表格式的结果插入到表中。

将此数据插入红移的有效方法是什么?

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

相关内容

  • 没有找到相关文章

最新更新