2015-01-11 9 views
24

के साथ पेंडस डेटाफ्रेम पर लौटें, मैं एक पोस्टग्रेएसक्यूएल डेटाबेस से पूछताछ करना चाहता हूं और आउटपुट को पांडस डेटाफ्रेम के रूप में वापस करना चाहता हूं।पोस्टग्रेएसक्यूएल क्वेरी से sqlalchemy

मैं sqlalchemy का उपयोग एक कनेक्शन डेटाबेस बनाने के लिए:

from sqlalchemy import create_engine 
engine = create_engine('postgresql://[email protected]:5432/mydb') 

मैं एक डेटाबेस तालिका करने के लिए एक पांडा dataframe लिखें:

i=pd.read_csv(path) 
i.to_sql('Stat_Table',engine,if_exists='replace') 

docs के आधार पर, pd.read_sql_query तरह लग रहा है () एक एसक्लाक्लेमी इंजन स्वीकार करना चाहिए:

a=pd.read_sql_query('select * from Stat_Table',con=engine) 

लेकिन यह टी एक त्रुटि को हल करता है:

ProgrammingError: (ProgrammingError) relation "stat_table" does not exist 

मैं पांडस संस्करण 0.14.1 का उपयोग कर रहा हूं।

ऐसा करने का सही तरीका क्या है?

उत्तर

32

आप पोस्टग्रेएसक्यूएल के साथ संवेदनशीलता के मुद्दों (मामले) में कटौती कर रहे हैं। आप क्वेरी में तालिका नाम उद्धृत करते हैं, यह काम करेगा:

df = pd.read_sql_query('select * from "Stat_Table"',con=engine) 

लेकिन व्यक्तिगत रूप से, मैं करने के लिए बस हमेशा की सलाह लोअर केस तालिका नाम (और स्तंभ नाम) का प्रयोग करेंगे, यह भी जब करने के लिए डेटाबेस के लिए तालिका लेखन ऐसे मुद्दों को रोकें।


PostgreSQL डॉक्स से

(http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS):

Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case

में और व्याख्या करने के लिए: आप डेटाबेस के लिए नाम Stat_Table के साथ एक मेज लिखा है (और SQLAlchemy इस नाम को उद्धृत करेगा, ताकि वह पोस्टग्रेज़ डेटाबेस में "Stat_Table" के रूप में लिखा जाएगा)। क्वेरी करते समय 'select * from Stat_Table' अनगिनत तालिका का नाम कम केस stat_table में परिवर्तित कर दिया जाएगा, और इसलिए आपको यह संदेश मिलता है कि यह तालिका नहीं मिली है।

देखें उदाहरण के लिए Are PostgreSQL column names case-sensitive?

+0

@AseemHegshetye यह मूल प्रश्न या इस उत्तर से पूरी तरह से असंबंधित है, इसलिए कृपया एक नया प्रश्न पूछें – joris

2

त्रुटि संदेश आपको बता रहा है जो किसी तालिका नामित:

stat_table 

मौजूद नहीं है (एक संबंध postgres में एक टेबल बात है)। तो, निश्चित रूप से आप इससे पंक्तियों का चयन नहीं कर सकते हैं। को क्रियान्वित करने के बाद अपने डाटाबेस की जाँच करें:

i.to_sql('Stat_Table',engine,if_exists='replace') 

और देखते हैं कि नाम से एक मेज अपने DB में बना लिया गया है, तो।

जब मैं अपने पढ़ने बयान का उपयोग करें:

df = pd.read_sql_query('select * from Stat_Table',con=engine) 

मैं डेटा एक postgres db से वापस मिलता है, तो वहाँ उसके साथ कुछ भी गलत नहीं है।

+1

धन्यवाद। चेक किया गया और तालिका वास्तव में बनाई गई थी। @ जॉरीस की तरह, यह टेबल नाम में एक केस संवेदनशीलता समस्या थी: मैंने तालिका को फिर से लिखा: 'i.to_sql ('stat_table', इंजन, if_exists = 'replace') 'और फिर यह काम करता है:' a = pd।read_sql_query ('stat_table' से चुनें, इंजन) ' – lmart999

+0

@ इमार्ट 999, जब मैंने लिखा: ** देखें कि उस नाम से एक तालिका आपके डीबी ** - ** में बनाई गई है, जिसका नाम ** नाम का जिक्र कर रहा था त्रुटि संदेश, जो 'stat_table' था। त्रुटि संदेश नाम प्रासंगिक है - आपको प्राप्त होने वाली किसी भी त्रुटि के साथ। और क्योंकि पाइथन कभी गलती नहीं करता है, त्रुटि का मतलब है कि आपका कोड कभी भी 'stat_name' नाम की एक तालिका नहीं बना है। देखें कि मैंने तालिका के नाम 'stat_name' को अपने स्वयं के अनुच्छेद में कैसे पोस्ट किया और इसे हाइलाइट किया - यह उस पर आपका ध्यान केंद्रित करना था। – 7stud

+0

ठीक है, मुझे मिल गया। मैंने एक ही समय में दोनों प्रतिक्रियाएं देखीं (ऑफलाइन थीं)। मैं देखता हूं कि आपकी प्रतिक्रिया मुझे एक ही उत्तर में ले जा रही है (उदाहरण के लिए, 'stat_table' नाम की तालिका सुनिश्चित की गई है) कि @ जोरिस ने स्पष्ट रूप से कहा है (उदाहरण के लिए, केस संवेदनशीलता मायने रखता है)। प्रतिक्रिया की सराहना करें। – lmart999

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