RethinkDB 2.3 - Binary objects

बाइनरी ऑब्जेक्ट्स को स्टोर करना




rethinkdb

बाइनरी ऑब्जेक्ट्स को स्टोर करना

यह दस्तावेज़ जावा के लिए पूरी तरह से अपडेट नहीं किया गया है। जावा के लिए एपीआई प्रलेखन पूरा हो गया है, लेकिन कई ReQL लेख अभी भी अन्य भाषाओं में उदाहरण हैं। जावा ड्राइवर के आधिकारिक तौर पर जारी होने के बाद हम प्रत्येक लेख को अपडेट करेंगे।

RethinkDB एक बाइनरी ऑब्जेक्ट प्रकार का समर्थन करता है, जिससे आप डेटाबेस में सीधे बाइनरी ऑब्जेक्ट्स को स्टोर करने के लिए ReQL का उपयोग करते हैं। ReQL ड्राइवर पारदर्शी रूप से ReQL प्रकार और bytes बीच अनुवाद करेगा।

इन उदाहरणों के लिए, हम मान लेंगे कि RethinkDB कनेक्शन को कॉन के रूप में वर्ग दायरे में उपलब्ध है।

डेटाबेस में अपलोड की गई फ़ाइलें संग्रहीत करना

वेब एप्लिकेशन के लिए उपयोगकर्ताओं से फ़ाइल अपलोड स्वीकार करना एक सामान्य कार्य है; RethinkDB के साथ आप इन फ़ाइलों को सीधे डेटाबेस में स्टोर कर सकते हैं।

import java.io.file.*;

/**
 * Store a file in the database.
 *
 * @param filePath  the path to the file to save
 * @param saveName  the filename to store with the file in the database
 * @param userId    user ID value
 */
public void saveFile(String[] filePath, String[] saveName, long userId) {
    byte[] fileData = Files.readAllBytes(filePath);
    r.table("files").insert(
        r.hashMap("userId", userId)
         .with("filename", saveName)
         .with("file", r.binary(fileData))
    ).run(conn);
}

saveFile , हम अपलोड की गई फ़ाइल के लिए एक पथ पास करते हैं (जो एक अस्थायी संग्रहण निर्देशिका में हो सकता है, यहां तक ​​कि आपके द्वारा उपयोग किए गए अपलोडिंग लाइब्रेरी के आधार पर एक अस्थायी नाम के साथ), फ़ाइल को सहेजने का नाम और आईडी उपयोगकर्ता जिसने फ़ाइल अपलोड की है। binary ReQL कमांड का उपयोग फ़ाइल की सामग्री को file क्षेत्र में एक बाइनरी ऑब्जेक्ट के रूप में संग्रहीत करने के लिए किया जाता है।

def get_user_file_ids(user_id):
    """
    Retrieve the IDs of previously-saved files for a user as a list of
    dicts: [{'id': x, 'filename': y}, ...]
    """
    return r.table('files').filter({'user_id': user_id}).pluck(
        'id', 'filename').run(conn)

def get_file(file_id):
    """
    Retrieve a file by its ID. Returns a dict with 'filename' and 'file'
    keys.
    """
    return r.table('files').get(file_id).pluck('file', 'filename').run(conn)

फिर, फ़ाइलों को पुनर्प्राप्त करने के दो कार्य हैं: एक उपयोगकर्ता द्वारा अपलोड की गई फ़ाइलों की एक निर्देशिका ( get_user_file_ids ) और एक वास्तविक फ़ाइल स्वयं प्राप्त करने के लिए ( get_file )। हमें यहां फिर से binary का उपयोग नहीं करना है; ReQL ड्राइवर हमारी ऑब्जेक्ट में file फ़ील्ड के लिए उचित डेटा प्रकार लौटाएगा।

उपयोगकर्ता अवतार संग्रहीत करना

यहां एक और मजेदार उदाहरण दिया गया है: उपयोगकर्ता खातों में Gravatar avatars जोड़ना। हम उन्हें पुनः प्राप्त करने के लिए http का उपयोग कर सकते हैं।

import hashlib

def add_gravatar(user_id):
    """
    Add a gravatar field with the binary avatar icon to user accounts if they
    have an avatar associated with their email address.
    """
    email = r.table('users').get(user_id)['email'].run(conn)
    hash = hashlib.md5(email).hexdigest()
    gravatar_url = 'http://www.gravatar.com/avatar/' + hash + '?d=retro'
    r.table('users').get(user_id).update({
        'gravatar': r.http(gravatar_url, result_format='binary')}).run(conn)

r.binary कहाँ है? आपको इस मामले में इसकी आवश्यकता नहीं है, क्योंकि r.http result_format='binary' विकल्प के साथ एक बाइनरी ऑब्जेक्ट result_format='binary' । (यदि भेजने वाले सर्वर पर MIME प्रकार सही ढंग से सेट है, तो आप उस बंद को छोड़ भी सकते हैं, और r.http सही प्रकार का पता r.http ।)