ここにその話があります。psql型のoidsをpythonの型にマッピングする - psycopg2を使って
私にはたくさんのストアドプロシージャがあり、すべてが独自の引数型を持っています。
私が探しているのは、Pythonでタイプセーフティレイヤーを少し作成して、データベースにヒットする前にすべての値が正しいタイプであることを確認できるようにすることです。
もちろん、私はもう一度pythonでスキーマ全体を書きたいとは思わないので、データベースから引数の名前と型をフェッチすることで、起動時にこの情報を自動的に生成できると思いました。
だから私はちょうど
SELECT proname, proargnames, proargtypes
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON pronamespace = n.oid
WHERE nspname = 'public';
をテストするために、このクエリをハックに進みその後
'1043 23 1043'
マイ各結果のために私のpythonからそれを実行すると「proargtypesでは」の私は、このような文字列を取得しますkeen eyeは、これらがpostgresqlタイプの文字列で、スペースで区切られていることを示しています。この特定の文字列は、関数がvarchar、integer、varcharを受け入れることを意味します。 だからPythonの話す中で、これは今、私はこれらの数字からPythonの型を取得する方法
(unicode, int, unicode)
すべきですか?
理想的な最終結果がこの
In [129]: get_python_type(23)
Out[129]: int
ようなものになるだろう、私はすべてのpsycopg2を通して見てきたし、私が見つけた最も近い「extensions.string_types」ですが、ただ、SQLタイプ名にOIDをマップします。
私は新しいタイプを登録する方法とPythonのタイプからsqlとその他のものに値をキャストする方法を見ていますが、 23がintになるか、または1043がstrになるか? –
いずれかの列にNULL値がある場合を除いて編集内容が有効になります。タイプがNoneになり、すべてが失われます。また、これらの手続きは執筆のためだけであり、それらの議論は対応するビューに直接マップしない。私は 'cursor.cast'メソッドを見つけました。これは私が扱えるものです。 –
私はこの質問もありますが、実際に何かを返すことを保証するものがないので(例えば、DBにレコードがない場合など)、編集は機能しません。しかし、その場合でも、cursor.descriptionを呼び出すことで、カラム型のOIDを取得できますが、それらがどのようなタイプのものに変換されているのかを知りたいと思います。 psycopgが変換を行うので、情報はどこかで入手できます。問題はこの情報にアクセスする方法です。 – ibrewster