Lewati ke isi

Pengembangan Skrip / Konstruksi SQL DFF.SQL

DFF.SQL(...) digunakan untuk membuat SQL berparameter, sehingga menghindari penyisipan input pengguna melalui penggabungan string. Sebagian besar Konektor SQL sudah memiliki kemampuan ini secara bawaan, sehingga Anda dapat langsung memanggil conn.query(sql, sql_params=...) atau conn.non_query(...).

Hanya jika perlu memformat SQL secara eksplisit untuk debugging, atau pemanggil harus menerima string SQL final, barulah DFF.SQL(...) perlu dipanggil secara terpisah.

Parameter dan Placeholder

Parameter Tipe Wajib / Nilai Default Keterangan
sql str Wajib Pernyataan SQL yang berisi placeholder parameter
sql_params list None Parameter SQL yang diberikan sesuai urutan placeholder
Placeholder Arti Contoh Hasil
? Parameter nilai, akan di-escape dan diberi tanda kutip 'user-001'
?? Pengenal atau fragmen SQL, tanpa tanda kutip users
Contoh
1
2
3
4
5
sql = DFF.SQL(
    'SELECT * FROM ?? WHERE id = ?',
    ['users', 'user-001'],
)
# SELECT * FROM users WHERE id = 'user-001'

?? tidak melindungi input yang tidak tepercaya

Input pengguna harus dimasukkan ke dalam ?. Pengenal seperti nama tabel dan nama kolom hanya boleh dimasukkan ke ?? jika berasal dari daftar yang diizinkan atau konfigurasi tepercaya, dan dilarang menyisipkan nilai SQL melalui f-string atau penggabungan string.

Ekspansi Parameter

Parameter array akan otomatis diperluas menjadi beberapa nilai, dan array dua dimensi akan diperluas menjadi beberapa baris nilai:

Ekspansi Array
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
rows = db.query(
    'SELECT * FROM ?? WHERE status IN (?)',
    ['demo', ['error', 'warning']],
)
# SELECT * FROM demo WHERE status IN ('error', 'warning')

affected_rows = db.non_query(
    'INSERT INTO ?? (id, name) VALUES ?',
    ['demo', [[1, 'a'], [2, 'b']]],
)
# INSERT INTO demo (id, name) VALUES (1, 'a'), (2, 'b')

Parameter kamus akan diperluas menjadi beberapa ekspresi penugasan:

Ekspansi Kamus
1
2
3
4
5
affected_rows = db.non_query(
    'INSERT INTO ?? SET ?',
    ['demo', {'id': 1, 'name': 'a'}],
)
# INSERT INTO demo SET id = 1, name = 'a'

Sebelum menjalankan SQL tulis atau hapus dinamis, pastikan kembali tabel target dan kondisi filter.