sql >> Databáze >  >> RDS >> Mysql

SQLAlchemy WHERE IN jedna hodnota (raw SQL)

Ne, parametry SQL se vždy zabývají pouze skalárním hodnoty. Zde budete muset vygenerovat SQL; pokud potřebujete raw SQL, použijte:

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()

např. vygenerovat dostatek parametrů pro uložení všech hodnot v some_list s formátováním řetězce a poté vygenerujte odpovídající parametry, které je vyplní.

Ještě lepší by bylo použít literal_column() objekt dělat veškeré generování za vás:

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()

ale pak byste možná mohli vygenerovat celý příkaz pomocí modulu `sqlalchemy.sql.expression, protože by to výrazně zjednodušilo podporu více databázových dialektů.

Navíc uid_in objekt již obsahuje odkazy na správné hodnoty pro parametry vazby; místo přeměny na řetězec, jak to děláme s str.format() výše, SQLAlchemy by měl skutečný objekt plus související parametry a už byste nemuseli generovat params slovník buď .

Mělo by fungovat následující:

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]))

kde sqlalchemy.sql.select() přebírá specifikaci sloupce (zde pevně zakódovanou na * ), klauzule where (vygenerovaná ze dvou klauzulí pomocí & vygenerovat SQL AND klauzule) a seznam volitelných položek; zde váš sqlalchemy.sql.table() hodnotu.

Rychlé demo:

>>> 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)

ale skutečný strom objektů vygenerovaný z toho všeho obsahuje také skutečné hodnoty pro parametry vazby, takže my_sess.execute() k nim má přímý přístup.




  1. Chyba syntaxe php, neočekávaná T_VARIABLE, očekává se ',' nebo '' na řádku 29

  2. Jak dezinfikovat raw SQL v Rails 4

  3. Jak optimalizovat výkon COUNT(*) na InnoDB pomocí indexu

  4. V PostgreSQL, podivný problém s výkonem citextu?