Skip to content

Postgres 节点常见问题#

以下是 Postgres 节点 的一些常见错误和问题以及解决或排除故障的步骤。

使用参数动态填充 SQL IN#

在 Postgres 中,您可以使用 SQL IN 比较构造在值组之间进行比较:

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

虽然您可以在查询中使用 n8n 表达式动态填充 IN 组中的值,但将其与查询参数结合使用可通过自动清理输入提供额外保护。

要使用查询参数构造 IN 组查询:

  1. Operation 操作设置为Execute Query 执行查询
  2. Options 选项中,选择Query Parameters 查询参数
  3. 使用表达式从输入数据中选择数组。例如,{{ $json.input_shirt_sizes }}
  4. Query 查询参数中,用空括号编写带有 IN 构造的查询。例如:
    1
    SELECT color, shirt_size FROM shirts WHERE shirt_size IN ();
    
  5. IN 括号内,使用表达式为查询参数数组中的项目数动态创建基于索引的占位符(如 $1$2$3)。您可以通过将每个数组索引增加一来做到这一点,因为占位符变量是从 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,可以使用Date & Time 日期和时间节点和设置为字符串 yyyy-MM-dd'T'HH:mm:ss 的自定义格式。

将 Date 列输出为日期字符串而不是 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 包关于日期的文档 中了解更多信息。