如何在 python 中为 postgresql 创建具有多个值的插入查询

How to create insert query with multiple values in python for postgresql

我在 df 中有类似的数据

time location information
2.13 India Good
2.34 USA Good

我需要将其更新为时间刻度数据库,其中时间是唯一键,我已经使用了

    list_db_df=df.values.tolist()

现在这变成了一个值列表,例如

[[2.13,India,Good],[2.34,USA,Good]]

我该如何为这样的插入查询编写此代码,

INSERT INTO table_name
  VALUES
    (NOW(), 'office', 70.0, 50.0),
    (NOW(), 'basement', 66.5, 60.0),
    (NOW(), 'garage', 77.0, 65.2);

基本上是这种格式

https://docs.timescale.com/timescaledb/latest/how-to-guides/write-data/insert/#insert

需要有关冲突条款的帮助 (Example)

INSERT INTO table_name
  VALUES ('2017-07-28 11:42:42.846621+00', 'office', 70.2, 50.1)
  ON CONFLICT (time, location) DO UPDATE
    SET temperature = excluded.temperature,
        humidity = excluded.humidity;

比如,excluded.temperature是什么。

提前致谢。

引自docs

The SET and WHERE clauses in ON CONFLICT DO UPDATE have access to the existing row using the table's name (or an alias), and to rows proposed for insertion using the special excluded table.

在您的示例中,excluded.temperature 的值为 70.2

详情

另见 DbFiddle example:

假设 table 已经有一行包含此主键('2017-07-28 11:42:42.846621+00'office):

time location temperature humidity
2017-07-28 12:42:42.846621+01 office 60.1 50

现在我们执行插入语句(具有相同的主键)和不同的 ON CONFLICT 子句

ON CONFLICT条款

INSERT INTO conditions VALUES ('2017-07-28 11:42:42.846621+00', 'office', 70.2, 50.1)

当我们不使用ON CONFLICT时,我们得到一个错误:

ERROR:  duplicate key value violates unique constraint "conditions_time_location_key"
DETAIL:  Key ("time", location)=(2017-07-28 12:42:42.846621+01, office) already exists.

冲突时什么都不做

INSERT INTO conditions 
VALUES ('2017-07-28 11:42:42.846621+00', 'office', 70.2, 50.1)
  ON CONFLICT DO NOTHING

在这种情况下,新数据将被忽略并且该行与以前相同:

time location temperature humidity
2017-07-28 12:42:42.846621+01 office 60.1 50

关于冲突请更新

示例:

INSERT INTO conditions 
VALUES ('2017-07-28 11:42:42.846621+00', 'office', 70.2, 50.1)
ON CONFLICT (time, location) DO UPDATE
    SET humidity = excluded.temperature;

将导致:

time location temperature humidity
2017-07-28 12:42:42.846621+01 office 60.1 70.2

注意:我们将 humidity 分配给 excluded.temperature - 这在生产应用程序中没有真正意义,仅用于说明其工作原理

当我们使用 ON CONFLICT DO UPDATE 时,我们可以访问一个名为 exclude 的特殊 table。 此 table 包含我们的插入语句中已排除(即忽略)的值,因为其他值已经存在。

在我们的案例中:

  • excluded.temperature70.2
  • excluded.humidity50.1

当您不对列使用 SET 时,该列将保留旧值:即 temperature 在我们的插入语句之后仍将是 60.1

当您对列使用 SET 时,您可以分配任何您喜欢的值:例如常量值、表达式或来自包含排除行的特殊 excluded table 的值。