2012-06-29 44 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'; 

然後我從蟒蛇運行它,併爲「proargtypes」我得到這樣一個字符串每個結果

'1043 23 1043' 

我敏銳的眼睛告訴我這些是由空格分隔的postgresql類型的oid,而這個特定的字符串表示該函數接受varchar,integer,varchar。 因此,在蟒蛇講,這應該是

(unicode, int, unicode) 

現在我怎樣才能從這些數字蟒蛇類型?

理想的最終結果將是這樣的

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

我已經看了全部通過psycopg2,我已經找到了最接近的是「extensions.string_types」但只是映射的OID到SQL類型名稱。

回答

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)) 

現在,您只需在編寫MySQL接口代碼時將Python類型映射到MySQL類型。 但坦率地說,這是一種將PostgreSQL類型的類型映射到MySQL類型的迂迴方式。我只是提到這兩個數據庫之間的衆多類型映射之一,如this

+1

我看到了如何註冊新類型以及如何將值從python類型轉換爲sql和whatnot,但確切地說代碼是' 23變成int'或'1043變成str'? –

+0

您的編輯將起作用,除非任何列的值爲空值,則該類型將變爲無且全部丟失。而且,這些過程僅用於書寫,而且它們的論據不會直接映射到相應的視圖。我發現了'cursor.cast'方法,這是我可以使用的。 –

+4

我也有這個問題,但編輯不起作用,因爲不能保證獲取一個實際返回任何東西(例如,如果在DB中沒有記錄)。但是,即使在這種情況下,我仍然可以通過調用cursor.description來獲取列類型的OID,但是我想知道它們被轉換成的Python類型。顯然這些信息在某處可用,因爲psycopg會進行轉換,問題是如何訪問這些信息。 – ibrewster