8

これが話です。

一連のストアド プロシージャがあり、すべてに独自の引数の型があります。
私がやろうとしているのは、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';

次に、Pythonから実行し、「proargtypes」の場合、結果ごとにこのような文字列を取得します

'1043 23 1043'

私の鋭い目によると、これらはスペースで区切られた postgresql 型の oid であり、この特定の文字列は、関数が varchar、integer、varchar を受け入れることを意味します。したがって、Pythonで言えば、これは

(unicode, int, unicode)

これらの数値から python の型を取得するにはどうすればよいですか?

理想的な最終結果は次のようになります

In [129]: get_python_type(23)
Out[129]: int

私はpsycopg2全体を見てきましたが、私が見つけた最も近いものは「extensions.string_types」ですが、それはoidをSQL型名にマップするだけです。

4

2 に答える 2

2

postgres の型と python の型のマッピングは、こちらに記載されています。それは役に立ちますか?

編集: テーブルからレコードを読み取ると、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))

これで、MySQL インターフェイス コードを記述しながら、Python の型を MySQL の型にマップするだけで済みます。しかし、率直に言って、これは PostgreSQL 型から MySQL 型に型をマッピングする回り道です。このように、これら 2 つのデータベース間の多数の型マッピングの 1 つを参照するだけです。

于 2012-06-29T07:04:02.460 に答える