1. ホーム
  2. python

Pandasのread_sqlにパラメータを付ける

2023-11-14 01:40:05

質問

PandasでSQLクエリでパラメータを渡す例はありますか?

特に、私はPostgreSQLデータベースに接続するためにSQLAlchemyエンジンを使用しています。 今のところ、以下のようにするとうまくいくことがわかりました。

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN %s AND %s'),
                   db,params=[datetime(2014,6,24,16,0),datetime(2014,6,24,17,0)],
                   index_col=['Timestamp'])

Pandasのドキュメントによると、paramsはdictとして渡すこともできるようですが、例えば試してみたところ、これがうまくいかないようです。

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN :dstart AND :dfinish'),
                   db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)},
                   index_col=['Timestamp'])

Pandasからこのような種類のクエリを実行するには、どのような方法が推奨されますか?

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

この read_sql docs にはこうあります。 params の引数はリスト、タプル、またはディクショナリーである ( docs ).

SQLクエリに値を渡すには、異なる構文が可能です。 ? , :1 , :name , %s , %(name)s (参照 PEP249 ).

しかし、これらの可能性のすべてが、すべてのデータベースドライバによってサポートされているわけではありません。 どの構文がサポートされているかは、使用しているドライバに依存します。 ( psycopg2 を使用するドライバに依存します。)

あなたの2番目のケースでは、dictを使う場合、「名前付き引数」を使っていることになり、それによると psycopg2 のドキュメントによると、これらは %(name)s のスタイルをサポートしています (そのため :name でしょう)、以下を参照してください。 http://initd.org/psycopg/docs/usage.html#query-parameters .

というわけで、このスタイルを使えばうまくいくはずです。

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" '
                     'where "Timestamp" BETWEEN %(dstart)s AND %(dfinish)s'),
                   db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)},
                   index_col=['Timestamp'])