web-dev-qa-db-ja.com

sqlalchemyを使用してPostgreSQLクエリからPandasデータフレームを返す

PostgreSQLデータベースをクエリし、出力をPandasデータフレームとして返します。

「SqlAlchemy」を使用してデータベースへの接続を作成しました。

from sqlalchemy import create_engine
engine = create_engine('postgresql://user@localhost:5432/mydb')

Pandasデータフレームをデータベーステーブルに書き込みます。

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)

ただし、エラーがスローされます。

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

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

これを行う正しい方法は何ですか?

50
lmart999

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

識別子を引用符で囲むと大文字と小文字が区別されますが、引用符で囲まれていない名前は常に小文字に変換されます

もう少し説明すると、Stat_Tableという名前のテーブルをデータベースに書き込みました(sqlalchemyはこの名前を引用するため、postgresデータベースでは "Stat_Table"として書き込まれます)。クエリを実行すると'select * from Stat_Table'引用符で囲まれていないテーブル名が小文字のstat_tableに変換されるため、このテーブルが見つからないというメッセージが表示されます。

例も参照してください PostgreSQLのカラム名は大文字と小文字を区別しますか?

62
joris

エラーメッセージは、次の名前のテーブルがあることを示しています。

stat_table

存在しません(関係はpostgresのテーブルです)。そのため、もちろん、そこから行を選択することはできません。実行後にデータベースを確認します。

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

その名前のテーブルがデータベースに作成されたかどうかを確認します。

Readステートメントを使用する場合:

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

Postgres dbからデータを取得するため、問題はありません。

2
7stud