2011-11-16 9 views
8

में पाइथन मसालेदार वस्तुओं को सहेजना मैं Django में पाइथन ऑब्जेक्ट्स को चुन रहा हूं और इसे MySQL डीबी में सहेज रहा हूं। अब तक मैं पालन किया है इन सरल नियमों:माईएसQL डीबी

  1. cPickle.dumps(object) #to मसालेदार वस्तु को अजगर वस्तु कन्वर्ट

  2. cPickle.loads(pickled_object) # मसालेदार वस्तु से अजगर वस्तु वापस लोड करने के लिए

  3. मेरे Django Model FieldText Field

  4. MySQL डीबी फ़ील्ड प्रकार longblob अट्रिब है Utes binary

  5. MySQL डाटाबेस एन्कोडिंग utf8_unicode_ci

है दुर्भाग्य से मैं समय पहले अजगर वस्तु लोड हो रहा है निम्न त्रुटि हो रही है।

Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',)) 

यह त्रुटि मान x07xb6x0bx06 पर देख यह एक एन्कोडिंग समस्या है द्वारा मुझे लगता है। क्या मुझे कुछ महत्वपूर्ण कदम याद आया ?? क्या कोई इस समस्या को हल करने में मेरी मदद कर सकता है ??

+1

आप अचार उपयोग करने के लिए एक विशेष कारण है? यह एक बाइनरी प्रारूप है और केवल अजगर द्वारा प्रयोग योग्य है। यदि आपके पास कोई विकल्प है, तो JSON बेहतर विकल्प नहीं होगा? –

+0

JSON मेरे उद्देश्य को सर्वर नहीं करता है, मैं 'json.dumps' का उपयोग करने का प्रयास करता हूं लेकिन यह त्रुटि मिली है 'some_object JSON serializable नहीं है'। और वस्तु शुद्ध पायथनिक है। –

+2

आपको उस ऑब्जेक्ट को क्रमबद्ध करने की कोशिश करनी चाहिए। जब आप एक बग खोजने की कोशिश कर रहे हैं तो यह आपके डीबी में मानव पठनीय सामान रखने में एक * बड़ी * सहायता है। –

उत्तर

5

यदि आप के आउटपुट को VARCHAR कॉलम में संग्रहीत करने का प्रयास कर रहे हैं, तो आपकी समस्या यह है कि आप एक वर्ण स्तंभ में बाइट-स्ट्रिंग को स्टोर करने का प्रयास कर रहे हैं। उस मामले में फिक्स आपके ऑब्जेक्ट को unicode(base64.encode(cPickle.dumps(myobject))) के रूप में एन्कोड करना है और फिर उसे स्टोर करना है।

वैकल्पिक रूप से:

object2varchar = lambda obj: unicode(base64.encode(cPickle.dumps(obj))) 
store(object2varchar([1, 'foo'])) 
1

एक और नियम: विकल्प charset=utf8 विकल्प के साथ mysql से कनेक्ट करें?

UPD1: कभी कभी यह एक अच्छा विचार पूरा SQL क्वेरी को देखने के लिए है, मैं आमतौर पर इसे उस तरह से कार्य करें:

>>> conn = MySQLdb.connect(**db_params) 
>>> "INSERT INTO tbl VALUES (%s)" % conn.literal((your_pickled_item,)) 
+0

नहीं, यह मेरी मदद नहीं करता है। फिर से वही त्रुटि। –

+0

@ आमिर-अदनान, क्या आपने पहले ही सहेजे जाने के बजाय एक नया आइटम सहेजने और पढ़ने की कोशिश की है? – newtover

+0

अच्छा सवाल, हाँ मैंने इसे चेक किया है, जब मैं कोड के भीतर पाइथन ऑब्जेक्ट को कन्वर्ट और पुनर्स्थापित करता हूं तो यह ठीक काम करता है, यह सही ढंग से पढ़ने या संग्रहीत करते समय डीबी के साथ समस्या है। मुझे क्या करना चाहिए? कृपया मदद करे। –

0

Newtover का जवाब शायद सही है, लेकिन

पर एक नजर है

https://github.com/bradjasper/django-pickledfield

यह वास्तव में मुझे कुछ समय बचाता है, और आप जो कुछ भी चाहते हैं उसे स्टोर कर सकते हैं।