【问题标题】:Redshift insert values into tableRedshift 将值插入表中
【发布时间】:2017-03-18 11:10:52
【问题描述】:

我正在尝试加载作为 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_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 的一种功能性且最好是高效的方法是什么?

【问题讨论】:

    标签: python postgresql amazon-redshift pg8000


    【解决方案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)
    );
    

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2018-12-12
      • 2015-04-01
      相关资源
      最近更新 更多