2009-02-11 19 views
9

एक sqlite3 में बाइनरी डेटा (यानी, किसी ब्लॉब सेल) के रूप में अजगर में एक सूची डंपिंग DB के लिए सबसे खूबसूरत विधि क्या है कन्वर्ट करने के लिए?अजगर, sqlite3 - कैसे एक सूची ब्लॉब सेल

data = [ 0, 1, 2, 3, 4, 5 ] 
# now write this to db as binary data 
# 0000 0000 
# 0000 0001 
# ... 
# 0000 0101 

उत्तर

8

मान लिया जाये कि आप चाहते हैं यह 8 बिट अहस्ताक्षरित मूल्यों का एक दृश्य के रूप में इलाज, array मॉड्यूल का उपयोग करें।

a = array.array('B', data) 
>>> a.tostring() 
'\x00\x01\x02\x03\x04\x05' 

उपयोग 'B' की तुलना में अलग typecodes आप विभिन्न प्रकार के रूप में डेटा का इलाज करना चाहते हैं। जैसे। एक हस्ताक्षरित पूर्णांक के लिए हस्ताक्षरित बाइट्स के अनुक्रम के लिए 'बी', या 'i'

+0

बस मुझे धन्यवाद चाहिए। –

19

ऐसा लगता है कि ब्रायन के समाधान अपनी आवश्यकताओं फिट बैठता है, लेकिन यह है कि विधि के साथ अपने बस एक स्ट्रिंग के रूप में डेटा संग्रहीत करने को ध्यान में रखना।

आप डेटाबेस में कच्चे बाइनरी डेटा संग्रहीत करना चाहते हैं (इसलिए यह नहीं अप के रूप में ज्यादा जगह ले करता है), एक बाइनरी SQLite वस्तु के लिए अपने डेटा को बदलने और फिर अपने डेटाबेस में जोड़ें।

query = u'''insert into testtable VALUES(?)''' 
b = sqlite3.Binary(some_binarydata) 
cur.execute(query,(b,)) 
con.commit() 

यहाँ SQLite ब्लॉब डेटा प्रतिबंध पर कुछ नोट कर रहे हैं (किसी कारण से इस अजगर दस्तावेज में प्रलेखित किया जाना प्रतीत नहीं होता है):

http://effbot.org/zone/sqlite-blob.htm

2

यह सामान्य देखें SourceForge पर समाधान है जो किसी भी मनमाने ढंग से अजगर वस्तु को शामिल किया गया (सूची, टपल, शब्दकोश, आदि सहित):

y_serial.py मो SQLite

साथ dule :: गोदाम पायथन वस्तुओं

"क्रमबद्धता + हठ :: कोड की कुछ लाइनों में, सेक और व्याख्या अजगर SQLite में वस्तुओं; उसके बाद बाद में उन्हें बिना किसी एसक्यूएल के कीवर्ड द्वारा क्रोनोलॉजिकल पुनर्प्राप्त करें। सबसे अधिक उपयोगी "मानक" दुकान स्कीमा-कम डेटा के लिए एक डेटाबेस के लिए मॉड्यूल। "

http://yserial.sourceforge.net

+0

हालांकि ओपीएस प्रश्न का कड़ाई से अच्छा जवाब नहीं है, मुझे यह कहना होगा कि मैंने आपके लिंक का पालन किया है और मॉड्यूल किसी भी परियोजना के लिए बेहद उपयुक्त है जिसे स्क्लाइट में पाइथन ऑब्जेक्ट्स को स्टोर और पुनर्प्राप्त करने की आवश्यकता है। धन्यवाद! – venzen

3

मैं एक ही समस्या है, और मैं किसी अन्य तरीके से इस को हल करने के बारे में सोच रहा हूँ।

मुझे लगता है कि pickle मॉड्यूल वास्तव में (अजगर वस्तुओं पर क्रमबद्धता) कुछ इस तरह

उदाहरण के लिए किया जाता है (यह एक फाइल करने के लिए डंपिंग के लिए है ... लेकिन मुझे लगता है कि डाटाबेस भंडारण के लिए आसानी से changeble है)

सहेजा जा रहा है:

# Save a dictionary into a pickle file. 
import pickle 
favorite_color = { "lion": "yellow", "kitty": "red" } 
pickle.dump(favorite_color, open("save.p", "w")) 

लोड हो रहा है:

# Load the dictionary back from the pickle file. 
import pickle 
favorite_color = pickle.load(open("save.p")) 

IMHO मुझे लगता है कि इस तरह से और अधिक सुरुचिपूर्ण और सुरक्षित (यह किसी अजगर वस्तु के लिए काम करता है) है।

वह मेरी 2 सेंट

अद्यतन है: After doing a bit of search on my idea, वे मेरी समाधान पर कुछ gotchas (मुझे लगता है कि मैदान पर एसक्यूएल खोज नहीं कर सकते हैं) दिखा। लेकिन मुझे अभी भी लगता है कि यह एक सभ्य समाधान है (यदि आपको उस क्षेत्र को खोजने की आवश्यकता नहीं है।

+2

ध्यान दें कि 'अचार' मॉड्यूल असुरक्षित है और गलत हो सकता है। जेएसओएन जैसे अधिक सुरक्षित, मानकीकृत, धारावाहिक प्रोटोकॉल का उपयोग करना आम तौर पर बेहतर होता है। –

1

ऑब्जेक्ट डेटा को अचार डंप, जेसन इत्यादि के रूप में स्टोर करना संभव है, लेकिन उन्हें इंडेक्स करना, उन्हें प्रतिबंधित करना और उन इंडेक्स का उपयोग करने वाले चुनिंदा प्रश्नों को चलाने के लिए भी संभव है। यहां टुपल्स के साथ उदाहरण दिया गया है, जिसे किसी अन्य पायथन वर्ग के लिए आसानी से लागू किया जा सकता है। जो कुछ आवश्यक है उसे पाइथन sqlite3 दस्तावेज में समझाया गया है (किसी ने पहले ही लिंक पोस्ट किया है)। वैसे भी यहां सभी को निम्नलिखित उदाहरण में एक साथ रखा गया है:

import sqlite3 
import pickle 

def adapt_tuple(tuple): 
    return pickle.dumps(tuple)  

sqlite3.register_adapter(tuple, adapt_tuple) #cannot use pickle.dumps directly because of inadequate argument signature 
sqlite3.register_converter("tuple", pickle.loads) 

def collate_tuple(string1, string2): 
    return cmp(pickle.loads(string1), pickle.loads(string2)) 

######################### 
# 1) Using declared types 
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES) 

con.create_collation("cmptuple", collate_tuple) 

cur = con.cursor() 
cur.execute("create table test(p tuple unique collate cmptuple) ") 
cur.execute("create index tuple_collated_index on test(p collate cmptuple)") 

cur.execute("select name, type from sqlite_master") # where type = 'table'") 
print(cur.fetchall()) 

p = (1,2,3) 
p1 = (1,2) 

cur.execute("insert into test(p) values (?)", (p,)) 
cur.execute("insert into test(p) values (?)", (p1,)) 
cur.execute("insert into test(p) values (?)", ((10, 1),)) 
cur.execute("insert into test(p) values (?)", (tuple((9, 33)) ,)) 
cur.execute("insert into test(p) values (?)", (((9, 5), 33) ,)) 

try: 
    cur.execute("insert into test(p) values (?)", (tuple((9, 33)) ,)) 
except Exception as e: 
    print e 

cur.execute("select p from test order by p") 
print "\nwith declared types and default collate on column:" 
for raw in cur: 
    print raw 

cur.execute("select p from test order by p collate cmptuple") 
print "\nwith declared types collate:" 
for raw in cur: 
    print raw 

con.create_function('pycmp', 2, cmp) 

print "\nselect grater than using cmp function:" 
cur.execute("select p from test where pycmp(p,?) >= 0", ((10,),)) 
for raw in cur: 
    print raw 

cur.execute("select p from test where pycmp(p,?) >= 0", ((3,))) 
for raw in cur: 
    print raw 

print "\nselect grater than using collate:" 
cur.execute("select p from test where p > ?", ((10,),)) 
for raw in cur: 
    print raw 

cur.execute("explain query plan select p from test where p > ?", ((3,))) 
for raw in cur: 
    print raw 

cur.close() 
con.close() 
संबंधित मुद्दे