N8N中文教程
集成节点/Built in_nodes/Actions/Postgres

Postgres 节点常见问题#

以下是使用 Postgres 节点 时的一些常见错误和问题,以及相应的解决或排查步骤。

使用参数动态填充 SQL IN 条件组#

在 Postgres 中,可以使用 SQL IN 比较结构 来对一组值进行比较:

1

| ``` SELECT color, shirt_size FROM shirts WHERE shirt_size IN ('small', 'medium', 'large');


---|---

虽然你可以在查询中使用 n8n 的 表达式(expressions) 动态地填充 `IN` 条件中的值,但结合使用 查询参数(query parameters) 可以提供额外的安全性,因为它会自动对输入进行清理(sanitizing input)。

要使用查询参数构建包含 `IN` 条件的查询,请按以下步骤操作:

1. 将 **操作(Operation)** 设置为 **执行查询(Execute Query)**。
2. 在 **选项(Options)** 中,选择 **查询参数(Query Parameters)**。
3. 使用表达式从输入数据中选择一个数组。例如:`{{ $json.input_shirt_sizes }}`。
4. 在 **查询(Query)** 参数中,编写包含 `IN` 结构且括号为空的 SQL 查询。例如:

1

| ```
SELECT color, shirt_size FROM shirts WHERE shirt_size IN ();

---|---

  1. IN 的括号内,使用表达式动态生成基于索引的占位符(如 $1$2$3),数量对应查询参数数组中的元素个数。由于占位符变量是 1 开始索引的,因此可以通过将数组索引加 1 实现:
1

| ``` SELECT color, shirt_size FROM shirts WHERE shirt_size IN ({{$json.input_shirt_sizes.map((i,pos)=>"$"+(pos+1)).join(', ')}});


---|---

使用此技术,n8n 会根据数组中的项目数量,自动为 `IN` 值创建正确数量的 预编译语句占位符。

## 处理时间戳和时区#

为了避免 n8n 和 Postgres 在解释时间戳和时区数据时出现复杂情况,请遵循以下通用建议:

  * **在存储和传递日期时使用 UTC**:使用 UTC 可以在不同表示形式和系统之间转换日期时避免时区转换带来的混淆。
  * **设置执行时区**:通过 环境变量(适用于自托管)或在 设置(适用于 n8n Cloud)中设置 n8n 的全局时区。你也可以在 工作流设置 中设置特定于工作流的时区。
  * **使用 ISO 8601 格式**:ISO 8601 格式 以标准化字符串编码了日、月、年、小时、分钟和秒。n8n 在节点之间以字符串形式传递日期,并使用 Luxon 解析日期。如果需要显式转换为 ISO 8601 格式,可以使用 日期与时间节点 并将自定义格式设为字符串 `yyyy-MM-dd'T'HH:mm:ss`。

## 将日期列输出为日期字符串而非 ISO 日期时间字符串#

n8n 使用 `pg` 包 与 Postgres 集成,这会影响 n8n 如何处理来自 Postgres 的日期(date)、时间戳(timestamp)及相关类型。

默认情况下,`pg` 包会将 `DATE` 值解析为 `new Date(row_value)`,生成符合 ISO 8601 日期时间字符串 格式的日期。例如,一个 `2025-12-25` 的日期可能会因实例的时区设置而生成类似 `2025-12-25T23:00:00.000Z` 的日期时间字符串。

为解决此问题,可在查询时使用 Postgres 的 `TO_CHAR` 函数 将日期格式化为期望的格式:

1


| ```
SELECT TO_CHAR(date_col, 'YYYY-MM-DD') AS date_col_as_date FROM table_with_date_col

---|--- 这将生成一个不包含时间和时区部分的日期字符串。延续之前的示例,使用此类型转换后,日期 2025-12-25 将生成字符串 2025-12-25。你可以在 pg 包关于日期的文档 中了解更多信息。