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 格式,可以使用日期时间节点并将自定义格式设置为字符串 yyyy-MM-dd'T'HH:mm:ss