Saya memiliki daftar python, katakanlah l
l = [1,5,8]
Saya ingin menulis kueri sql untuk mendapatkan data untuk semua elemen daftar, katakanlah
select name from students where id = |IN THE LIST l|
Bagaimana saya melakukannya?
Jawaban sejauh ini telah membuat template nilai menjadi string SQL biasa. Itu baik-baik saja untuk integer, tetapi jika kita ingin melakukannya untuk string kita mendapatkan masalah escaping.
Berikut adalah varian yang menggunakan kueri berparameter yang akan berfungsi untuk keduanya:
placeholder= '?' # For SQLite. See DBAPI paramstyle.
placeholders= ', '.join(placeholder for unused in l)
query= 'SELECT name FROM students WHERE id IN (%s)' % placeholders
cursor.execute(query, l)
','.join(placeholder * len(l))
akan menjadi sedikit lebih pendek sementara masih dapat dibaca imho([placeholder]*len(l))
dalam kasus umum karena tempat penampung dapat terdiri dari banyak karakter.cursor.execute(f'SELECT name FROM students WHERE id IN ({','.join('?' for _ in l)})', l)
. @bobince, Anda juga harus berkomentar dalam solusi Anda bahwa menggunakan?
adalah cara yang aman untuk menghindari injeksi SQL. Ada banyak jawaban di sini yang rentan, pada dasarnya semua yang menggabungkan string dengan python.Cara termudah adalah dengan mengubah daftar menjadi yang
tuple
pertamasumber
Jangan mempersulit, Solusi untuk ini sederhana.
Saya harap ini membantu !!!
sumber
l
hanya berisi satu elemen, Anda akan berakhir denganid IN (1,)
. Yang merupakan kesalahan sintaks.sqlite3
. Perpustakaan apa yang Anda uji ini?SQL yang Anda inginkan adalah
Jika Anda ingin membuat ini dari python, Anda dapat menggunakan
Fungsi peta akan mengubah daftar menjadi daftar string yang dapat direkatkan dengan koma menggunakan metode str.join .
Kalau tidak:
jika Anda lebih suka ekspresi generator daripada fungsi peta.
UPDATE: S. Lott menyebutkan di komentar bahwa binding Python SQLite tidak mendukung urutan. Dalam hal ini, Anda mungkin ingin
Dihasilkan oleh
sumber
string. Bergabunglah dengan nilai daftar yang dipisahkan dengan koma, dan gunakan operator format untuk membentuk string kueri.
(Terima kasih, blair-conrad )
sumber
%
digunakan di sini hanyalah pemformatan string Python biasa.Saya suka jawaban bobince:
Tapi saya perhatikan ini:
Bisa diganti dengan:
Saya menemukan ini lebih langsung jika kurang pintar dan kurang umum. Di sini
l
diperlukan untuk memiliki panjang (yaitu merujuk ke objek yang mendefinisikan__len__
metode), yang seharusnya tidak menjadi masalah. Tapi placeholder juga harus satu karakter. Untuk mendukung penggunaan placeholder multi-karakter:sumber
Solusi untuk jawaban @umounted, karena itu putus dengan tupel satu elemen, karena (1,) bukan SQL yang valid .:
Solusi lain untuk string sql:
sumber
Ini seharusnya menyelesaikan masalah Anda.
sumber
Jika Anda menggunakan PostgreSQL dengan pustaka Psycopg2, Anda dapat membiarkan adaptasi tupelnya melakukan semua pelolosan dan interpolasi string untuk Anda, misalnya:
yaitu, pastikan Anda meneruskan
IN
parameter sebagai atuple
. jika itu adalahlist
Anda dapat menggunakan= ANY
sintaks array :perhatikan bahwa keduanya akan diubah menjadi rencana kueri yang sama sehingga Anda sebaiknya menggunakan mana saja yang lebih mudah. misalnya jika daftar Anda datang dalam bentuk tupel, gunakan yang pertama, jika mereka disimpan dalam daftar, gunakan yang terakhir.
sumber
Misalnya, jika Anda menginginkan kueri sql:
Bagaimana dengan:
sumber
solusi yang lebih sederhana:
sumber
The
:var
notasi tampaknya sederhana. (Python 3.7)sumber
Ini menggunakan substitusi parameter dan menangani kasus daftar nilai tunggal:
sumber