4

我有一个表会话,它在 postgres 中具有 UUID 类型的 sess_uuid 列,我的问题是我必须使用查询从 ColdFusion cfQuery 更新会话表:

UPDATE sessions
    SET     sess_frn_usr_id = 1 
    WHERE   sess_uuid = <cfqueryparam value="#arguments.SessionToSave.get('sessUuid')#" cfsqltype="cf_sql_other">   

此查询中的问题是 sess_uuid 列在数据库中属于 UUID 类型,而在 ColdFusion 中,等效类型cf_sql_other不适用于此。错误是:

错误:运算符不存在:uuid = 字符变化

此处使用 ColdFusion 中的哪种 cf_sql 类型来映射 postgres 中的 UUID 列?

4

2 回答 2

1

我针对 PostgreSQL 9.1 使用 CF9.0 和 10 测试了您的查询,并且类型cf_sql_other工作得很好。因此,要么这不是导致错误的实际查询,要么可能发生了超出我们所见的其他事情。您的 DSN 是否有任何特殊的 jdbc 连接设置?

    ERROR: operator does not exist: uuid = character varying

此处使用 ColdFusion 中的哪种 cf_sql 类型来映射 postgres 中的 UUID 列?

根据我有限的测试和一些快速搜索cf_sql_other是与 CF9+ 中捆绑的 PostgreSQL 驱动程序一起使用的正确类型。在 jdbc 3中 PostgreSQL 的类型没有直接的等价物uuid,所以 typeOTHER用于表示它是特定于数据库的,驱动程序内部从那里获取它。

我只能通过使用其中一种字符串类型来重现您的错误,例如cf_sql_varchar或省略cfsqltype默认为cf_sql_char. 鉴于错误消息,不支持 uuid 和字符串之间的直接比较。您必须先将 uuid 显式转换为字符串(反之亦然)。下面的所有示例都适用于 CF9+ 和 PostgreSQL 9.1。

  <!--- uuid = "d0c2b125-9222-d479-fb4a-be912b8c7c3b" --->
  <!--- syntax 1 ---->
  WHERE   CAST(sess_uuid AS VARCHAR)  = <cfqueryparam value="#uuid#" cfsqltype="cf_sql_varchar">   

  <!--- syntax 2 ---->
  WHERE   sess_uuid::text  = <cfqueryparam value="#uuid#" cfsqltype="cf_sql_varchar">   

  <!--- syntax 3 --->
  WHERE   sess_uuid  = <cfqueryparam value="#uuid#" cfsqltype="cf_sql_varchar">::uuid   

虽然我不推荐它,但值得注意的是省略 cfqueryparam 也可以。由于与值的直接比较varchar失败(即使在 postgresql 中)我猜在这种情况下会发生一些额外的转换魔法。

  <!--- fails --->
  WHERE   sess_uuid = CAST('#uuid#' AS VARCHAR)

  <!--- works --->
  WHERE   sess_uuid = '#uuid#'
于 2013-01-03T23:33:23.750 回答
0

你能限定你所说的“不工作”吗?是否出现验证错误?您能否更新您的问题以包含该信息。

CF_SQL_IDSTAMP工作?

如果没有,那么您无能为力。您可以根本不对其进行类型检查(这cfsqltype不是 的必需参数<cfqueryparam>),或者为了完整起见,只需将其视为 aCF_SQL_VARCHAR并对其进行长度检查。

于 2013-01-02T13:58:07.763 回答