Я использую MySQLdb в Python. Мне сказали, что для правильного создания операторов SQL и во избежание атак с использованием SQL-кода я должен написать что-то вроде:
sql = "insert into table VALUES ( %s, %s, %s )"
args = var1, var2, var3
cursor.execute( sql, args )
Или:
cursor.execute( "insert into table VALUES ( %s, %s, %s )", var1, var2, var3 )
Или даже это (это может быть неправильно):
header = ( 'id', 'first_name', 'last_name' )
values = ( '12', 'bob' , 'smith' )
cursor.execute( "insert into table ( %s ) values ( %s )", ( header + values ) )
Когда я программировал на PHP, я обычно сохранял весь свой оператор SQL как длинную строку, а затем выполнял ее. Что-то вроде (с PostgreSQL):
$id = db_prep_string( pg_escape_string( $id ) );
$first_name = db_prep_string( pg_escape_string( $first_name ) );
$last_name = db_prep_string( pg_escape_string( $last_name ) );
$query = "insert into table ( id, first_name, last_name ) values ( $id, $first_name, $last_name )"
$result = pg_query( $con, $query );
$retval = pg_fetch_array( $result );
где db_prep_string
равно
function db_prep_string( $value ) {
if(
!isset( $value ) ||
(is_null($value)) ||
preg_match( '/^\s+$/', $value ) ||
( $value == '' )
) {
$value = 'null';
}
else {
$value = "'$value'";
}
return $value;
}
Затем для отладки я мог бы просто вывести $query
, чтобы просмотреть весь оператор SQL. Есть ли что-то подобное, что я могу сделать с Python? Другими словами, могу ли я сохранить SQL-оператор safe в виде строки, распечатать его для отладки, а затем выполнить?
Я хотел бы сделать что-то вроде:
id = prevent_sql_injection_string( id )
first_name = prevent_sql_injection_string( first_name )
last_name = prevent_sql_injection_string( last_name )
sql = "insert into table ( id, first_name, last_name ) values "
sql += id + ", "
sql += first_name + ", "
sql += last_name
print sql #for debugging
cursor.execute( sql )
Если нет, то как мне просмотреть оператор SQL полностью в Python?
Дополнительный вопрос: как ввести нулевые значения в оператор SQL с использованием Python?