2016-08-03 22 views
5

के साथ sqlite में numpy पूर्णांक प्रकारों को सम्मिलित करना पायथन 3 में डेटाबेस में numpy पूर्णांक वस्तुओं के मान डालने का सही तरीका क्या है? अजगर में 2.7 numpy सांख्यिक डेटाटाइप्स SQLite में सफाई से सम्मिलित है, लेकिन वे अजगर में नहीं है 3python3

import numpy as np 
import sqlite3 
conn = sqlite3.connect(":memory:") 
conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))") 
conn.execute("insert into foo values(?)", (np.int64(100),)) # <-- Fails in 3 

np.float प्रकार अभी भी दोनों 2 और 3.

conn.execute("insert into foo values(?)", (np.float64(101),)) 

में ठीक से काम करने लगते हैं पायथन 2 में, numpy scalar integer डेटाटाइप अब इंट के उदाहरण नहीं हैं, यहां तक ​​कि इंटीजर-मूल्यवान फ़्लोटिंग पॉइंट संख्याओं को इनट्स में परिवर्तित भी करते हैं।

isinstance(np.int64(1), int) # <- true for 2, false for python 3 

क्या यही कारण है कि dbapi अब numpy के साथ सहजता से काम नहीं करता है?

+0

एक numpy पूर्णांक प्रकार संख्या का सिर्फ बाइट प्रतिनिधित्व नहीं है (यह '.item()' मूल्य); एक वस्तु है, लगभग एक तत्व, 0 डी, सरणी के समान ही है। इसलिए मुझे नहीं लगता कि आप इसे डेटाबेस में अपने सभी गंदे महिमा में सहेज सकते हैं। आप इसके पूर्णांक मान, या कुछ बाइट समकक्ष को बचा सकते हैं, लेकिन पूर्ण numpy ऑब्जेक्ट नहीं। उपयोगकर्ता परिभाषित ऑब्जेक्ट उदाहरण को सहेजने के बारे में 'sqlite3' में कुछ भी है? – hpaulj

+0

हमेशा डरावनी अचार-दृष्टिकोण (टेक्स्ट प्रकार को लक्षित करना), या कुछ और आधुनिक और द्विआधारी-आधारित [संदेशपैक] (http://msgpack.org/) (बीएलओबी प्रकार को लक्षित करना) पर आधारित है। – sascha

+0

'100' के बजाय' np.int64 (100) 'को सहेजने का क्या फायदा है? क्या कोई उपयोगी जानकारी है कि आप एक fetch के दौरान ठीक नहीं हो सका? आप देख सकते हैं कि SQLAlchemy जैसे मॉड्यूल एसक्यूएल-ऑब्जेक्ट इंटरफेस को कैसे संभालते हैं। – hpaulj

उत्तर

4

sqlite3 डॉक्स के अनुसार:

SQLite के साथ अन्य अजगर प्रकार का उपयोग करने के लिए, आप उन्हें SQLite के लिए sqlite3 मॉड्यूल के समर्थित प्रकारों में से एक के लिए अनुकूल होना चाहिए: NoneType में से एक, int, नाव, str, तो बाइट्स।

तो तुम अनुकूलित कर सकते हैंnp.int64 प्रकार। आप कुछ इस तरह करना चाहिए:

import numpy as np 
import sqlite3 

sqlite3.register_adapter(np.int64, lambda val: int(val)) 
conn = sqlite3.connect(":memory:") 
conn.execute("CREATE TABLE foo (id INTEGER NOT NULL, primary key (id))") 
conn.execute("insert into foo values(?)", (np.int64(100),)) 

Docs