2015-01-11 27 views
24

我想查詢PostgreSQL數據庫並將輸出作爲Pandas數據框返回。使用sqlalchemy從PostgreSQL查詢返回Pandas數據框

我用sqlalchemy創建連接的數據庫:

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

我寫了大熊貓據幀到數據庫表:

i=pd.read_csv(path) 
i.to_sql('Stat_Table',engine,if_exists='replace') 
基於該 docs

,看起來像pd.read_sql_query( )應該接受SQLAlchemy引擎:

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

但它t出現錯誤:

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

我使用Pandas版本0.14.1。

什麼是正確的方法來做到這一點?

回答

32

你被PostgreSQL的case(in)敏感問題困擾了。如果您在查詢中引用的表名,它的工作:

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的將引用這個名字,所以它將在postgres數據庫中寫爲「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') 

看看你的數據庫中是否創建了一個由該名稱創建的表。

當我使用你讀的語句:

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

我得到的數據從一個Postgres數據庫回來,所以沒有什麼不妥的地方。

+1

謝謝。檢查和表確實創建。像@joris說的那樣,這是表名中的一個大小寫敏感的問題:我重新編寫了表格:'i.to_sql('stat_table',engine,if_exists ='replace')'然後它工作:'a = pd。read_sql_query('select * from stat_table',engine)' – lmart999

+0

@ Imart999,當我寫道:**看看在你的數據庫中是否創建了一個由該名稱創建的表** - **該名稱**指的是名稱該錯誤消息是'stat_table'。錯誤消息名稱與您遇到的任何錯誤是相關的。而且由於python從不犯錯誤,這個錯誤意味着你的代碼永遠不會創建一個名爲'stat_name'的表。看看我如何在自己的段落中發佈表名「stat_name」並突出顯示它 - 這應該引起你的注意。 – 7stud

+0

對,我明白了。我同時看到了兩個回覆(處於離線狀態)。我發現你的回答讓我得出了相同的答案(例如,確保寫明瞭@joris明確指出的名爲'stat_table'的表)(例如,區分大小寫問題)。欣賞迴應。 – lmart999

相關問題