Jak działa parametryzacja zapytań SQL?
Czuję się trochę głupio za to, że o to pytam, ponieważ wydaje mi się, że jestem jedyną osobą na świecie, która tego nie rozumie, ale i tak tu idzie. Jako przykład użyję Pythona. Kiedy używam surowych zapytań SQL (zwykle używam ORM) używam parametryzacji, jak w tym przykładzie, używając SQLite:
Metoda A:
username = "wayne"
query_params = (username)
cursor.execute("SELECT * FROM mytable WHERE user=?", query_params)
Wiem, że to działa i wiem, że jest to ogólnie zalecany sposób, aby to zrobić. Podejściem polegającym na wstrzykiwaniu kodu SQL w taki sam sposób byłoby coś takiego:
Metoda B:
username = "wayne"
cursor.execute("SELECT * FROM mytable WHERE user='%s'" % username)
O ile wiem, rozumiem wstrzyknięcie SQL, jak wyjaśniono wten artykuł w Wikipedii. Moje pytanie jest po prostu: w jaki sposób metoda naprawdę różni się od metody B? Dlaczego wynik końcowy metody A nie jest taki sam jak metoda B? Zakładam, żecursor.execute()
metoda (część specyfikacji DB-API Pythona) dba o poprawne uciekanie i sprawdzanie typu danych wejściowych, ale nigdzie nie jest to wyraźnie zaznaczone. Czy to wszystko jest parametryzacją w tym kontekście? Dla mnie, kiedy mówimy „parametryzacja”, wszystko to oznacza „podstawianie łańcuchów”, jak np.% -Formatowanie. Czy to nieprawda?