Bosh sahifa Wiki Parameterized query

Parameterized query

Parameterized querySQL buyruq tuzilmasi bilan foydalanuvchi yoki ilova qiymatlarini alohida uzatadigan so‘rov. SQL matnidagi placeholderlar database driver tomonidan parametrlar bilan bog‘lanadi; qiymatlar SQL kodi sifatida qayta parse qilinmaydi.

Tuzilma va qiymatning ajratilishi

Quyidagi Python DB-API misolida %s qiymat uchun placeholder hisoblanadi:

cursor.execute(
    "SELECT id, email FROM users WHERE email = %s AND active = %s",
    (email, True),
)

Driver parametrlarning tipi va qiymatini database protokoli orqali uzatadi. Placeholder sintaksisi kutubxonaga qarab ?, $1, :name yoki boshqa ko‘rinishda bo‘lishi mumkin. Bir driver sintaksisini boshqasiga ko‘r-ko‘rona ko‘chirish xato beradi.

String interpolation bilan SQL yasash xavfli:

# Xavfli usul
sql = f"SELECT * FROM users WHERE email = '{email}'"

Qiymatda quote yoki maxsus SQL bo‘lagi bo‘lsa, so‘rov ma’nosi o‘zgaradi. Parametr bog‘lash SQL injectionning qiymat orqali kiradigan asosiy turini to‘sadi va escapingni qo‘lda bajarish zaruratini kamaytiradi.

Nimalarni parametr qilib bo‘lmaydi

Parametr odatda literal qiymat o‘rnini egallaydi, identifier yoki SQL kalit so‘zi o‘rnini emas. Jadval nomi, ustun nomi, ASC yoki DESCni oddiy placeholder bilan uzatib bo‘lmaydi. Dynamic identifier kerak bo‘lsa, ilova oldindan ruxsat etilgan nomlar ro‘yxatidan tanlaydi va database kutubxonasining identifier quoting vositasidan foydalanadi.

IN ro‘yxatida ham bitta placeholderga vergul bilan birlashtirilgan satr berish bir nechta qiymatga aylanmaydi. Driver qo‘llagan array parametri, har element uchun alohida placeholder yoki temporary table kabi usul tanlanadi. Bo‘sh ro‘yxat holati alohida ko‘rib chiqiladi.

Tiplar va NULL

Parametr tipi driver, qiymatning dasturlash tili turi yoki aniq cast orqali belgilanadi. Sana, decimal, UUID va binar ma’lumot satrga aylantirib yuborilmay, mos native tipda uzatilishi ma’qul. Bu timezone, aniqlik va encoding xatolarini kamaytiradi.

SQL NULL bilan column = NULL ishlamaydi; IS NULL kerak. Ixtiyoriy filter uchun so‘rov mantiqi aniq tuziladi. Bir parametrga noma’lum tip berilganda optimizer yoki database type inference qiynalishi mumkin, shuning uchun zarur joyda cast ko‘rsatiladi.

Prepared statement va samaradorlik

Parameterized query bilan prepared statement yaqin tushunchalar, ammo aynan bir xil emas. Driver parametrlarni xavfsiz bog‘lab, har safar serverda yangi statement bajarishi mumkin. Haqiqiy prepared statement parse va plan ma’lumotini qayta ishlatadi. Bu ko‘p takrorlanadigan so‘rovda overheadni kamaytirishi mumkin.

Plan cache har doim tezlik bermaydi. Parametr qiymatlari juda turli selectivityga ega bo‘lsa, umumiy plan ayrim qiymatlar uchun samarasiz chiqadi. Query plan real parametr toifalari bilan kuzatiladi.

Chegaralar

Parametr bog‘lash autentifikatsiya, authorization va ma’lumot validationini almashtirmaydi. Foydalanuvchi o‘ziga tegishli bo‘lmagan qator ID sini xavfsiz parametrda yuborsa ham, access control bo‘lmasa ma’lumot ochiladi. Shuningdek, LIKE parametridagi % va _ wildcard sifatida ishlaydi; literal qidiruv kerak bo‘lsa alohida escape qilinadi. Loglarda SQL strukturasini qayd etish mumkin, lekin password, token va shaxsiy parametr qiymatlari maskalanadi.

Batch insertda har qator qiymatlari parametr sifatida uzatiladi; driverning bulk API yoki array binding imkoniyati ko‘p alohida round-tripni kamaytiradi. Statement timeout va transaction chegarasi baribir belgilanadi. Juda katta batch lock va replication lagni oshirishi mumkin, shuning uchun o‘lchami real database yukida tanlanadi.

Bog‘liq tushunchalar

SQL injection, Prepared statement, Placeholder, Database driver, Bind variable, Query plan, Input validation, Access control