Входные переменные пользователя в cx_Oracle?

Я использую cx_Oracle для доступа к нашей базе данных. Я хотел бы, чтобы пользователь мог ввести идентификатор станции, например:

stationID = (независимо от того, что пользователь вводит при запросе)

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

Поскольку оператор должен быть строкой, как я могу ввести переменную, определенную пользователем?

Как это не сделать:

 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, но я не могу проверить его. Некоторые базы данных используют разные символы (например, вместо %s в случае SQLite).

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

Edit : По-видимому, cx_Oracle умолчанию имеет «named» paramstyle (вы можете проверить это, посмотрев на cx_Oracle.paramstyle .). В этом случае вы сделали бы что-то вроде этого:

 query = "select foo from bar where station=:station_id" cursor.execute(query, station_id=id)