1. ホーム
  2. python

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

2023-09-16 03:25:41

質問

PostgreSQLのデータベースに問い合わせを行い、その出力をPandasのデータフレームとして返したいのですが、可能でしょうか?

SqlAlchemy'でデータベースへの接続を作成しました。

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

Pandasのdataframeをデータベースのテーブルに書き込んでいます。

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を使っています。

どのような方法が正しいのでしょうか?

どのように解決するのですか?

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 の列名は大文字と小文字を区別しますか?