4

postgres に UUID 型の sess_uuid 列を持つテーブル セッションがあります。私の問題は、 query を使用して 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 = 文字が異なります

Postgres で UUID 列をマップするためにここで使用する ColdFusion の cf_sql タイプはどれですか?

4

2 に答える 2

1

PostgreSQL 9.1 に対して CF9.0 と 10 の両方でクエリをテストしたcf_sql_otherところ、型は問題なく動作しました。したがって、それはエラーの原因となっている実際のクエリではないか、または目に見える以上のことが起こっている可能性があります。DSN に特別な jdbc 接続設定がありますか?

    ERROR: operator does not exist: uuid = character varying

Postgres で UUID 列をマップするためにここで使用する ColdFusion の cf_sql タイプはどれですか?

私の限られたテストといくつかの簡単な検索に基づくとcf_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 でも) 失敗するので、この 1 つのケースでは追加の変換マジックが発生していると思います。

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

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

「働かない」とはどういう意味ですか? 検証エラーでエラーになっていますか?その情報を含めるように質問を更新してください。

動作しCF_SQL_IDSTAMPませんか?

そうでなければ、できることはあまりありません。タイプチェックをまったく行わないか ( thecfsqltypeは の必須パラメーターではありません<cfqueryparam>)、完全を期すために単に として扱いCF_SQL_VARCHAR、長さチェックも行うことができます。

于 2013-01-02T13:58:07.763 に答える