@kake008

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonのpsycopg2で、SQLのカラム名を変数として動的に指定したい

【実現したいこと】

PythonからPostgreSQLに接続し、SELECT文を実行しようとしています。
特定のカラム名を変数として渡して、動的にクエリを組み立てたいです。

【試したこと・発生している問題】

通常のプレースホルダ(%s や $1 など)を使おうとしましたが、
調べてみるとプレースホルダにはカラム名は指定できないと知りました。

現在は以下のようにカラム名をベタ書きしていますが、これを変数にするには
どのような方法が一般的なのでしょうか?

【該当のコード】

import psycopg2

現在のコード(カラム名が固定になってしまっています)
cur.execute('SELECT premium01, premium30, premium90, humanresource1, randdpersale, roe, pbr, attitude, dealtype FROM sampledata01 WHERE roe IS NOT NULL;')

【開発環境】

・Python 3.14.0
・psycopg2
・PostgreSQL

0 likes

1Answer

from psycopg2 import sql
query = sql.SQL("SELECT {col} FROM sample").format(
    col=sql.Identifier(col_name)
)
cur.execute(query)

こんな感じでやる方法はありますが、通常カラム名は固定で書いておくほうがいいですよ。

例えば、該当コードの

SELECT 
  premium01, premium30, premium90, 
  humanresource1, randdpersale, roe, 
  pbr, attitude, dealtype 
FROM sampledata01 
WHERE roe IS NOT NULL

premium01とかpremium30を動的に切り替えたい場合はテーブルの構造の方を修正して、

SELECT 
  premium.value, sample.humanresource1, sample.randdpersale, sample.roe, 
  sample.pbr, sample.attitude, sample.dealtype 
FROM sampledata01 sample
JOIN premiumdata premium ON premium.data_id = sample.id
WHERE sample.roe IS NOT NULL AND premium.type = %s;

とかにして、プレースホルダーに '01' とか '30' とか入れるのが一般的じゃないかなと思います。

0Like

Your answer might help someone💌