2012-03-15 12 views
7

में पोस्टग्रेएसक्यूएल बहुआयामी सरणी मैं डेबियन निचोड़ पर PostgreSQL 8.4 के साथ SQLAlchemy 0.6.3 का उपयोग कर रहा हूं। मुझे एक टेबल चाहिए जहां एक कॉलम PostgreSQL में कुछ संग्रहीत करता है जो पूर्णांक सूचियों या पूर्णांक tuples के tuples की सूची के रूप में पाइथन में दिखाई देता है। जैसेएसक्यूएलकेमी

((1,2), (3,4), (5,6,7)) 

नीचे दिए गए उदाहरण में कॉलम model है। मैंने सोचा कि एक उचित दृष्टिकोण सामान को पीजी 2 आयामी तालिका के रूप में स्टोर करना हो सकता है, जो पीजी में integer[][] जैसा दिखता है। मुझे नहीं पता कि एसक्यूएलए किस प्रकार इसे पाइथन पर वापस कर देगा, लेकिन मुझे उम्मीद है कि यह टुपल्स की तरह कुछ है।

हालांकि, मैं समझ नहीं सकता कि मुझे दो आयामी पूर्णांक सरणी देने के लिए एसक्यूएलए को कैसे बताना है। sqlalchemy.dialects.postgresql.ARRAY के लिए documentation कहते

item_type - इस सरणी की वस्तुओं के डेटा प्रकार। ध्यान दें कि आयामता यहां अप्रासंगिक है, इसलिए INTEGER [] [], जैसे बहु-आयामी सरणी ARRAY (इंटीजर) के रूप में निर्मित हैं, ARRAY (ARRAY (Integer)) या ऐसे में नहीं। फ्लाई पर टाइप मैपिंग आंकड़े।

दुर्भाग्यवश, मुझे नहीं पता कि इसका क्या अर्थ है। प्रकार मैपिंग फ्लाई पर यह कैसे पता लगा सकता है? इसे सही डीडीएल बनाने की जरूरत है। यह करने के लिए मेरा पहला और एकमात्र अनुमान ARRAY(ARRAY(Integer)) होगा। वर्तमान में मैं

crossval_table = Table(
     name, meta, 
     Column('id', Integer, primary_key=True), 
     Column('created', TIMESTAMP(), default=now()), 
     Column('sample', postgresql.ARRAY(Integer)), 
     Column('model', postgresql.ARRAY(Integer)), 
     Column('time', Float), 
     schema = schema, 

यह निम्न DDL

CREATE TABLE crossval (
    id integer NOT NULL, 
    created timestamp without time zone, 
    sample integer[], 
    model integer[], 
    "time" double precision 
); 

जो सही नहीं है, निश्चित रूप से बनाता है। मैं क्या खो रहा हूँ?

+0

यदि आप इस तरह की बहुत सारी चीजें करने जा रहे हैं तो आप मौसम पर विचार नहीं कर सकते हैं एक रिलेशनल डीबी आपके लिए सबसे अच्छा विकल्प है। – Mark

+0

@ मार्क: मैं इसका पालन नहीं करता हूं। कितनी चीज है? –

+0

यदि आप मानचित्रों के मानचित्रों या मानचित्रों के बहुत सारे सरणी बनाए रखने की कोशिश कर रहे हैं तो आप उस डेटाबेस को देखना चाहेंगे जो उस अवधारणा को प्रथम श्रेणी के रूप में समर्थन देता है जैसे रेडिस – Mark

उत्तर

3

मैं इसका जवाब यहां दे रहा हूं, क्योंकि माइक बेयर ने इस सवाल का जवाब स्क्लेक्लेमी उपयोगकर्ताओं पर दिया था।

thread पर SQLLchechemy-user पर देखें जहां माइक बेयर इस प्रश्न का उत्तर देते हैं। जैसा कि माइक ने स्पष्ट किया, और जैसा कि मैंने पीजी दस्तावेज पढ़ने के दौरान याद किया, पीजी वास्तव में सरणी आयामों को लागू नहीं करता है, न ही एसक्यूएलए करता है। तो, कोई integer[][] लिख सकता है, लेकिन पीजी integer[] से अलग तरीके से इसका इलाज नहीं करता है। विशेष रूप से, पीजी और एसक्यूएलए दोनों किसी भी आयाम की सरणी अभिव्यक्ति स्वीकार करेंगे। मुझे यकीन नहीं है कि यह मामला क्यों है। माइक द्वारा उद्धृत, PG Arrays documentation कहते

वर्तमान कार्यान्वयन या तो आयामों की घोषणा की संख्या लागू नहीं करता है। आयामों के आकार या संख्या के बावजूद, किसी विशेष तत्व प्रकार के Arrays सभी समान प्रकार के मानते हैं। इसलिए, में सरणी आकार या आयामों की संख्या घोषित करना तालिका बनाएं केवल दस्तावेज़ीकरण है; यह रन-टाइम व्यवहार को प्रभावित नहीं करता है।

वह भी ticket खोला गया। ऐसा लगता है कि यह एसक्यूएलए स्तर पर आयामों को लागू करना है।

4

मैं इस

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('postgresql://:5432/test', echo=True) 

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.dialects import postgresql 

Base = declarative_base() 


from sqlalchemy import Column, Integer, String 

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    sample = Column(postgresql.ARRAY(Integer)) 


Base.metadata.create_all(engine) 

Session = sessionmaker(engine) 
s = Session() 

a = User() 
a.name='test' 
a.sample = [[1,2], [3,4]] 
s.add(a) 
s.commit() 

की कोशिश की मुझे लगता है कि यह आपकी समस्या का समाधान होगा। क्योंकि doc में वे उल्लेख करते हैं।

हालांकि, वर्तमान कार्यान्वयन किसी भी आपूर्ति की गई सरणी आकार सीमा को अनदेखा करता है, यानी, व्यवहार अनिर्दिष्ट लंबाई के सरणी के समान होता है।

तो यदि आप कुछ भी घोषित नहीं कर रहे हैं तो यह वह सरणी होगी जो आप चाहते हैं।

+0

हाय लाफाडा। आप सही ballpark में थे, लेकिन दस्तावेज के गलत टुकड़े उद्धृत। मुद्दा आयामों के बारे में था, सरणी आकार सीमा नहीं। ऊपर मेरा अपडेट देखें। चूंकि आप उत्तर देने वाले एकमात्र व्यक्ति हैं, यदि आप अपना उत्तर ठीक करते हैं, तो मैं इसे स्वीकार करूंगा। :-) –

+0

आपको sqlalchemy द्वारा 'पूर्णांक []' के बजाय 'पूर्णांक [] [] 'घोषित करने की आवश्यकता है। लेकिन अब यह sqlalchemy के लिए मेरे ज्ञान से बाहर :)। – Nilesh

+0

क्षमा करें, मैं इस टिप्पणी का पालन नहीं करता हूं। –

संबंधित मुद्दे