5

私は cx_Oracle を使用してデータベースにアクセスしています。ユーザーがステーション ID を入力できるようにしたいと思います。たとえば、次のようにします。

stationID=(プロンプトでユーザーが入力したもの)

cursor.execute('''select cruise, station, stratum
          from union_fscs_svsta
          where station=stationID
          order by cruise''')

ステートメントは文字列である必要があるため、ユーザー定義変数を組み込むにはどうすればよいですか?

4

1 に答える 1

9

しない方法:

id = raw_input("Enter the Station ID")
query = "select foo from bar where station={station_id}"
cursor.execute(query.format(station_id=id))

誰かが悪意のある SQL 文字列を入力すると、それが実行されます。

Python を使用して文字列をフォーマットする代わりに、データベース バックエンドに処理させます。これを行う方法は、使用しているデータベースによって異なります。(?) これは Oracle では正しいと思いますが、テストできません。一部のデータベースでは、異なる文字が使用されています (たとえば、SQLite の場合の?代わりに)。%s

id = raw_input("Enter the Station ID")
query = "select foo from bar where station=%s"
cursor.execute(query, [id])

編集:どうやら、cx_Oracleデフォルトで「名前付き」のparamstyleに設定されています(これは.を見て確認できcx_Oracle.paramstyleます)。その場合、次のようにします。

query = "select foo from bar where station=:station_id"
cursor.execute(query, station_id=id)
于 2012-11-30T18:53:39.700 に答える