postgresql UUID等效于coldFusion

时间:2013-01-02 13:17:39

标签: postgresql coldfusion uuid postgresql-9.1

我有一个表会话,在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列?

2 个答案:

答案 0 :(得分:1)

我使用CF9.0和10测试了你的查询,针对PostgreSQL 9.1,类型cf_sql_other工作正常。因此,要么这不是导致错误的实际查询,要么可能超出我们所能看到的其他内容。您的DSN是否有任何特殊的jdbc连接设置?

    ERROR: operator does not exist: uuid = character varying
     

这里使用ColdFusion中的哪个cf_sql类型来映射UUID列   在postgres?

基于我的有限测试和a few quick searchescf_sql_other是与CF9 +捆绑的PostgreSQL驱动程序一起使用的正确类型。在jdbc 3中没有PostgreSQL的uuid类型的直接等价,因此类型OTHER用于表示它是特定于数据库的,并且驱动程序内部从那里获取它。

我只能使用其中一个字符串类型重现您的错误,例如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#'

答案 1 :(得分:0)

你可以通过“不工作”来证明你的意思吗?它是否因验证错误而出错?您能否请更新您的问题以包含该信息。

CF_SQL_IDSTAMP不起作用吗?

如果没有,那么你无能为力。您可以根本不对其进行输入检查(cfsqltype不是<cfqueryparam>必需参数),或者为了完整起见,只需将其视为{{ 1}}和长度 - 检查它。