2012-06-29 10 views
5

के साथ कहानी है।मैकिंग psql प्रकार oids python प्रकारों के लिए - psycopg2

मेरे पास संग्रहित प्रक्रियाओं का एक गुच्छा है और सभी के पास अपने स्वयं के तर्क प्रकार हैं।
मैं जो करना चाहता हूं वह है कि पाइथन में एक प्रकार की सुरक्षा परत बनाना है ताकि मैं सुनिश्चित कर सकूं कि डेटाबेस को मारने से पहले सभी मान सही प्रकार के हैं।

बेशक मैं पूरी स्कीमा को अजगर में फिर से लिखना नहीं चाहता, इसलिए मैंने सोचा कि मैं डेटाबेस से तर्क नाम और प्रकार लाने के द्वारा स्टार्टअप पर इस जानकारी को स्वतः उत्पन्न कर सकता हूं।

तो मैं सिर्फ परीक्षण के लिए

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' 

के लिए इस तरह एक स्ट्रिंग प्राप्त इस क्वेरी अप हैक करने के लिए आगे बढ़ना मेरे उत्सुक आंख मुझे बताती है कि ये पोस्टग्रेस्क्ल प्रकारों के लिए ओड्स हैं, जो अंतरिक्ष से पृथक हैं, और यह विशेष स्ट्रिंग का अर्थ है कि फ़ंक्शन वर्कर, पूर्णांक, वर्कर स्वीकार करता है। तो अजगर बात में, इस

(unicode, int, unicode) 

अब होना चाहिए कि कैसे मैं इन नंबरों से अजगर प्रकार मिल सकता है?

आदर्श अंतिम परिणाम इस

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

मैं psycopg2 के माध्यम से सभी देखा है और निकटतम मैं मिल गया है 'extensions.string_types' है, लेकिन है कि बस एसक्यूएल प्रकार के नाम करने के लिए OIDs नक्शे की तरह कुछ होगा।

उत्तर

1

पोस्टग्रेस प्रकार और पायथन प्रकारों का मानचित्रण here दिया गया है। क्या उससे मदद हुई?

संपादित करें: जब आप किसी तालिका से रिकॉर्ड पढ़ते हैं, तो पोस्टग्रेस (या कोई डेटाबेस) ड्राइवर स्वचालित रूप से रिकॉर्ड कॉलम प्रकार को पायथन प्रकारों पर मैप करेगा।

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 इंटरफ़ेस कोड लिखने MySQL प्रकार के लिए अजगर प्रकार मैप करने के लिए किया है। लेकिन, स्पष्ट रूप से, यह PostgreSQL प्रकार से MySQL प्रकारों में मैपिंग प्रकारों का एक चौराहे तरीका है। मैं इन दो डेटाबेसों के बीच this

+1

देख रहा हूं कि मैं नए प्रकारों को कैसे पंजीकृत कर सकता हूं और पाइथन प्रकारों से एसक्यूएल और व्हाट्नॉट से मूल्यों को कैसे डाला जा सकता हूं, लेकिन वास्तव में कोड कहां है, 23 int 'या' 1043 str बन जाता है '? –

+0

आपका संपादन EXCEPT काम करेगा जब किसी भी कॉलम में शून्य मान होता है, तो प्रकार अभी कोई नहीं बन जाएगा और सब खो जाएंगे। साथ ही, ये प्रक्रियाएं केवल लेखन के लिए हैं और उनके तर्क सीधे संबंधित विचारों पर मानचित्र बनाते हैं। मुझे 'कर्सर.कास्ट' विधि मिली, हालांकि कुछ ऐसा है जो मैं काम कर सकता हूं। –

+4

मेरे पास यह प्रश्न भी है, लेकिन संपादन काम नहीं करेगा क्योंकि वास्तव में कुछ भी लौटने की कोई गारंटी नहीं है (उदाहरण के लिए, यदि डीबी में कोई रिकॉर्ड नहीं है)। यहां तक ​​कि उस मामले में, हालांकि, मैं अभी भी कर्सर डिस्क्रिप्शन को कॉल करके कॉलम प्रकार ओआईडी प्राप्त कर सकता हूं, लेकिन मैं जानना चाहता हूं कि किस पाइथन प्रकार का अनुवाद किया जाता है। स्पष्ट रूप से जानकारी कहीं भी उपलब्ध है, क्योंकि psycopg रूपांतरण करता है, प्रश्न यह है कि इस जानकारी तक कैसे पहुंचे। – ibrewster

संबंधित मुद्दे