ठीक है, मुझे एक उत्तर मिला। PostgreSQL में, आप Python का उपयोग करके फ़ंक्शन लिख सकते हैं। पायथन के उपयोग को सक्षम करने के लिए, आपको अपने PostgreSQL की स्थापना के लिए आवश्यक पायथन के विशिष्ट संस्करण को स्थापित करना होगा और इसे PATH पर्यावरण चर में उपलब्ध कराना होगा। आप इंस्टॉलेशन नोट्स को देखकर पा सकते हैं कि आपके PostgreSQL के इंस्टॉलेशन को Python के किस संस्करण की आवश्यकता है। मैं वर्तमान में विंडोज़ पर PostgreSQL 9.6.5 का उपयोग कर रहा हूं और यह पायथन 3.3 के लिए कहता है। मैंने शुरुआत में नवीनतम पायथन 3.6 की कोशिश की, लेकिन यह काम नहीं करेगा। मैंने विंडोज के लिए नवीनतम पायथन 3.3 के साथ समझौता किया, जो कि 3.3.5 है।
पायथन को स्थापित करने के बाद, आप इसे CREATE EXTENSION plpython3u;
निष्पादित करके PostgreSQL में सक्षम करते हैं। आपके डेटाबेस पर जैसा कि यहां प्रलेखित है https://www.postgresql.org/docs /current/static/plpython.html
. वहां से, आप Python निकायों के साथ कोई भी फ़ंक्शन लिख सकते हैं।
मेरे विशिष्ट मामले के लिए bytea
. से कनवर्ट करने के लिए करने के लिए double precision[]
और पीछे, मैंने निम्नलिखित कार्य लिखे:
CREATE FUNCTION bytea_to_double_array(b bytea)
RETURNS double precision[]
LANGUAGE 'plpython3u'
AS $BODY$
if 'struct' in GD:
struct = GD['struct']
else:
import struct
GD['struct'] = struct
return struct.unpack('<' + str(int(len(b) / 8)) + 'd', b)
$BODY$;
CREATE FUNCTION double_array_to_bytea(dblarray double precision[])
RETURNS bytea
LANGUAGE 'plpython3u'
AS $BODY$
if 'struct' in GD:
struct = GD['struct']
else:
import struct
GD['struct'] = struct
# dblarray here is really a list.
# PostgreSQL passes SQL arrays as Python lists
return struct.pack('<' + str(int(len(dblarray))) + 'd', *dblarray)
$BODY$;
मेरे मामले में, सभी युगल छोटे एंडियन में संग्रहीत हैं, इसलिए मैं <
. का उपयोग करता हूं . मैं struct
. के आयात को भी कैश करता हूं वैश्विक शब्दकोश में मॉड्यूल जैसा कि https://stackoverflow.com/a/15025425/5274457में वर्णित है। ए> . मैंने एसडी के बजाय जीडी का इस्तेमाल किया क्योंकि मैं चाहता हूं कि अन्य कार्यों में आयात उपलब्ध हो जो मैं लिख सकता हूं। जीडी और एसडी के बारे में जानकारी के लिए देखें https://www.postgresql .org/docs/current/static/plpython-sharing.html
।
इसे क्रिया में देखने के लिए, मेरे डेटाबेस में बूँदों को छोटे एंडियन के रूप में संग्रहीत किया जाता है,
SELECT bytea_to_double_array(decode('efbeaddeefbeadde', 'hex')), encode(double_array_to_bytea(array[-1.1885959257070704E148]), 'hex');
और मुझे जो उत्तर मिलता है वह है
bytea_to_double_array | encode
double precision[] | text
-------------------------+------------------
{-1.18859592570707e+148} | efbeaddeefbeadde
जहां 'efbeaddeefbeadde'
'deadbeefdeadbeef'
है लिटिल एंडियन में।