Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQLAlchemy WHERE IN nilai tunggal (SQL mentah)

Tidak, parameter SQL hanya berurusan dengan skalar nilai-nilai. Anda harus membuat SQL di sini; jika Anda membutuhkan SQL mentah, gunakan:

statement = "SELECT * FROM table WHERE `key`='rating' AND uid IN ({})".format(
    ', '.join([':i{}'.format(i) for i in range(len(some_list))]))

my_sess.execute(
        statement, 
        params={'i{}'.format(i): v for i, v in enumerate(some_list)})
    ).fetchall()

misalnya menghasilkan parameter yang cukup untuk menampung semua nilai di some_list dengan pemformatan string, lalu buat parameter yang cocok untuk mengisinya.

Lebih baik lagi menggunakan literal_column() objek untuk melakukan semua pembangkitan untuk Anda:

from sqlalchemy.sql import literal_column

uid_in = literal_column('uid').in_(some_list)
statement = "SELECT * FROM able WHERE `key`='rating' AND {}".format(uid_in)

my_sess.execute(
        statement, 
        params={'uid_{}'.format(i): v for i, v in enumerate(some_list)})
    ).fetchall()

tetapi kemudian Anda mungkin dapat membuat seluruh pernyataan menggunakan modul `sqlalchemy.sql.expression, karena ini akan membuat mendukung banyak dialek basis data menjadi lebih mudah.

Selain itu, uid_in objek sudah memegang referensi ke nilai yang tepat untuk parameter pengikatan; alih-alih mengubahnya menjadi string seperti yang kita lakukan dengan str.format() tindakan di atas, SQLAlchemy akan memiliki objek aktual ditambah parameter terkait dan Anda tidak perlu lagi membuat params kamus salah satu .

Berikut ini akan berfungsi:

from sqlalchemy.sql import table, literal_column, select

tbl = table('table')
key_clause = literal_column('key') == 'rating'
uid_clause = literal_column('uid').in_(some_list)
my_sess.execute(select('*', key_clause & uid_clause, [tbl]))

di mana sqlalchemy.sql.select() mengambil spesifikasi kolom (di sini dikodekan ke * ), klausa where (dihasilkan dari dua klausa dengan & untuk menghasilkan SQL AND klausa) dan daftar yang dapat dipilih; di sini Anda sqlalchemy.sql.table() nilai.

Demo cepat:

>>> from sqlalchemy.sql import table, literal_column, select
>>> some_list = ['foo', 'bar']
>>> tbl = table('table')
>>> key_clause = literal_column('key') == 'rating'
>>> uid_clause = literal_column('uid').in_(some_list)
>>> print select('*', key_clause & uid_clause, [tbl])
SELECT * 
FROM "table" 
WHERE key = :key_1 AND uid IN (:uid_1, :uid_2)

tetapi pohon objek aktual yang dihasilkan dari semua ini berisi nilai aktual untuk parameter pengikatan juga, jadi my_sess.execute() dapat mengakses ini secara langsung.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di mana lokasi mysql client .my.cnf di XAMPP untuk Windows?

  2. masukkan mysql jika tidak ada tanpa kunci unik

  3. Memiliki Timeout untuk memperoleh koneksi setelah memutakhirkan Knex

  4. Hasil kueri PHP SQL

  5. Migrasi Django :tidak membuat tabel