2015-01-11 13 views
24

PostgreSQLデータベースにクエリを行い、その結果をPandasデータフレームとして返したいとします。sqlalchemyを使用したPostgreSQLクエリからのPandasデータフレームの返信

私はデータベースの接続を作成するためにsqlalchemyを使用します。

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

私はデータベーステーブルにパンダのデータフレームを記述します。

docsに基づいて
i=pd.read_csv(path) 
i.to_sql('Stat_Table',engine,if_exists='replace') 

は、(pd.read_sql_queryのように見えます)はSQLAlchemyエンジンを受け入れるべきです:

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

しかし、それはエラーが発生します:

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

私はPandasバージョン0.14.1を使用しています。

これは正しい方法はありますか?

答えて

32

あなたは、PostgreSQLの大文字と小文字の区別の問題で噛まれます。クエリでテーブル名を引用した場合、それは動作します:

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') 

をし、その名前のテーブルがあなたのDBに作成してしまった場合は次を参照してください。実行した後、あなたのDBを確認してください。

私はあなたのREAD文を使用する場合:

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

を、私は戻ってPostgresのDBからデータを取得し、それと間違って何もありません。

+1

も参照してください。チェックされ、テーブルが作成されました。 @jorisと同様に、テーブル名の大文字と小文字の区別の問題でした。テーブルを書き直しました: 'i.to_sql( 'stat_table'、engine、if_exists = 'replace')'それから、 'a = pd。read_sql_query( 'select * from stat_table'、エンジン) ' – lmart999

+0

@ Imart999、私が書いたとき:**その名前のテーブルがあなたのデータベースに作成されているかどうかを確認する** - **その名前**はエラーメッセージは 'stat_table'でした。エラーメッセージの名前は、関連するものです。取得するエラーがあります。そしてPythonは決して間違いをするので、エラーはコードが 'stat_name'という名前のテーブルを作成したことを意味しませんでした。私がテーブル名 'stat_name'をそれ自身の段落に投稿して強調表示していることを見てください。それはそれに注意を向けることになっていました。 – 7stud

+0

そうです、私はそれを手に入れます。私は両方の反応を同時に見た(オフラインだった)。 @jorisが明示的に指定したものと同じ回答(例:大文字と小文字の区別)につながっていることがわかりました。応答を感謝します。 – lmart999

関連する問題