PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL में बाइटा को डबल प्रिसिजन में बदलें

ठीक है, मुझे एक उत्तर मिला। 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' है लिटिल एंडियन में।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दिनांक $1 . पर पैरामीटरयुक्त क्वेरी में PostgreSQL सिंटैक्स त्रुटि

  2. विशिष्ट तालिकाओं और प्रविष्टियों के लिए एक डेटाबेस डंप बनाना Postgres

  3. PostgreSQL/JDBC और TIMESTAMP बनाम TIMESTAMPTZ

  4. PostgreSQL में CSV फ़ाइल कैसे आयात करें

  5. SQLAlchemy में सेट-रिटर्निंग फ़ंक्शन (SRF) और एक्सेस कॉलम के साथ जुड़ना