如何在 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.temperature
是 70.2
excluded.humidity
是 50.1
当您不对列使用 SET
时,该列将保留旧值:即 temperature
在我们的插入语句之后仍将是 60.1
。
当您对列使用 SET
时,您可以分配任何您喜欢的值:例如常量值、表达式或来自包含排除行的特殊 excluded
table 的值。
我在 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.temperature
是70.2
excluded.humidity
是50.1
当您不对列使用 SET
时,该列将保留旧值:即 temperature
在我们的插入语句之后仍将是 60.1
。
当您对列使用 SET
时,您可以分配任何您喜欢的值:例如常量值、表达式或来自包含排除行的特殊 excluded
table 的值。