2

Cのlibpqライブラリを使用してPostgreSQLデータベースにアクセスしています。したがって、res = PQexec(conn、 "SELECT point FROM test_point3d");を実行すると 取得したPGresultをカスタムデータ型に変換する方法がわかりません。

PQgetValue関数を使用できることはわかっていますが、返される文字列をカスタムデータ型に変換する方法がわかりません。

4

1 に答える 1

4

これについて考える最良の方法は、データ型がテキスト インターフェイスを介してアプリケーションと対話することです。Libpq は、あらゆるものから文字列を返します。プログラマは、文字列を解析し、そこからデータ型を作成する責任があります。著者がおそらく質問を放棄したことは知っていますが、私は同様のことに取り組んでおり、場合によっては役立ついくつかの重要なトリックをここに文書化する価値があります.

明らかに、これが独自の in および out 表現を持つ C 言語の型である場合は、通常の方法で文字列を解析する必要があります。

ただし、配列やタプルの表記は基本的に

[open_type_identifier][csv_string][close_type_identifier]

たとえば、タプルは次のように表すことができます。

(35,65,1111111,f,f,2011-10-06,"2011-10-07 13:11:24.324195",186,chris,f,,,,f)

これにより、解析が容易になります。通常、最初と最後の文字を削除すると、既存の csv プロセッサを使用できます。さらに、次のことを考慮してください。

select row('test', 'testing, inc', array['test', 'testing, inc']);
                       row                       
-------------------------------------------------
 (test,"testing, inc","{test,""testing, inc""}")
(1 row)

これが示すように、ネストされた属性内に標準の CSV エスケープがあるため、実際には、3 番目の属性が配列であると判断し、(二重引用符を解除して) 配列として解析することができます。このようにして、ネストされたデータ構造は、JSON のような形式で期待されるものとほぼ同じ方法で処理できます。秘訣は、ネストされた CSV であることです。

于 2013-03-14T11:58:30.407 に答える