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を使用しています。
これを行う正しい方法は何ですか?
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のカラム名は大文字と小文字を区別しますか?
エラーメッセージは、次の名前のテーブルがあることを示しています。
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からデータを取得するため、問題はありません。