2012-10-25 17 views
6

मैं स्ट्रिंग को gzip करने की कोशिश कर रहा हूं और फिर इसे psycopg2 का उपयोग करके bytea कॉलम में लिख रहा हूं।psycopg - INSERT gzipped डेटा bytea कॉलम

तालिका:

CREATE TABLE test 
(
    data bytea 
) 

डालने:

import psycopg2 

data = "some string".encode("zlib") # 'x\x9c+\xce\xcfMU(.)\xca\xccK\x07\x00\x1ak\x04l' 

conn = psycopg2.connect("my parameters") 
cur = conn.cursor() 
cur.execute("INSERT INTO public.test VALUES (%s)", (data,)) 

    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0x9c 

इस पुस्तकालय के साथ एक मुद्दा है? क्या मुझे एन्कोडिंग को किसी भी तरह बदलने की ज़रूरत है? किसी भी मदद की सराहना की है।

उत्तर

15

यदि आप डेटाबेस में बाइनरी डेटा डालना चाहते हैं, तो आपको psycopg2.Binary() wrapper का उपयोग करने की आवश्यकता होगी। आपके द्वारा की गई स्ट्रिंग का उपयोग करने से डेटा को टेक्स्ट के रूप में माना जाएगा, जिसे एन्कोडिंग समस्याओं के कारण या तो अस्वीकार कर दिया जाएगा, या स्वीकार्य हो जाएगा, जब आप इसे फिर से पढ़ने का प्रयास करेंगे।

के साथ पिछले निष्पादित कॉल के बजाय ऐसे:

cur.execute("INSERT INTO public.test VALUES (%s)", (psycopg2.Binary(data),)) 
+0

एक भी क्षेत्र के लिए या सिर्फ पूरी पंक्ति के लिए काम करता है? – amphibient

+0

आपको एकाधिक 'psycopg2.Binary' प्रकार स्थितित्मक पैरामीटर प्रदान करने से रोक नहीं है। यह सिर्फ मानक पायथन डीबी-एपीआई है। –