2012-06-29 10 views
5

ここにその話があります。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をマップします。

答えて

1

postgresタイプとpythonタイプのマッピングはhereです。それは役に立ちますか?

編集: テーブルからレコードを読み込むと、postgres(またはデータベース)ドライバは自動的にレコード列タイプをPythonタイプにマップします。

cur = con.cursor() 
cur.execute("SELECT * FROM Writers") 

row = cur.fetchone() 

for index, val in enumerate(row): 
    print "column {0} value {1} of type {2}".format(index, val, type(val)) 

これで、Pythonの型をMySQLの型にマップするだけで、MySQLのインターフェイスコードを書き込むことができます。 しかし、率直に言って、これはPostgreSQL型からMySQL型への型をラウンドアバウトする方法です。私はちょうどこれらの2つのデータベース間の多くのタイプのマッピングの1つを参照してくださいthis

+1

私は新しいタイプを登録する方法とPythonのタイプからsqlとその他のものに値をキャストする方法を見ていますが、 23がintになるか、または1043がstrになるか? –

+0

いずれかの列にNULL値がある場合を除いて編集内容が有効になります。タイプがNoneになり、すべてが失われます。また、これらの手続きは執筆のためだけであり、それらの議論は対応するビューに直接マップしない。私は 'cursor.cast'メソッドを見つけました。これは私が扱えるものです。 –

+4

私はこの質問もありますが、実際に何かを返すことを保証するものがないので(例えば、DBにレコードがない場合など)、編集は機能しません。しかし、その場合でも、cursor.descriptionを呼び出すことで、カラム型のOIDを取得できますが、それらがどのようなタイプのものに変換されているのかを知りたいと思います。 psycopgが変換を行うので、情報はどこかで入手できます。問題はこの情報にアクセスする方法です。 – ibrewster

関連する問題