Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQLAlchemy WHERE IN pojedyncza wartość (surowy SQL)

Nie, parametry SQL zawsze dotyczą tylko skalaru wartości. Tutaj będziesz musiał wygenerować SQL; jeśli potrzebujesz surowego SQL, użyj:

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

np. wygeneruj wystarczającą ilość parametrów, aby pomieścić wszystkie wartości w some_list z formatowaniem ciągów, a następnie wygeneruj pasujące parametry, aby je wypełnić.

Jeszcze lepiej byłoby użyć literal_column() obiekt zrobić za Ciebie całe generowanie:

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 wtedy być może mógłbyś po prostu wygenerować całą instrukcję za pomocą modułu `sqlalchemy.sql.expression, ponieważ znacznie ułatwiłoby to obsługę wielu dialektów baz danych.

Ponadto uid_in obiekt posiada już odniesienia do właściwych wartości parametrów wiązania; zamiast zamieniać go w ciąg, jak to robimy z str.format() powyżej, SQLAlchemy miałby rzeczywisty obiekt plus powiązane parametry i nie musiałbyś już generować params słownik albo .

Powinny działać:

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

gdzie sqlalchemy.sql.select() przyjmuje specyfikację kolumny (tutaj zakodowaną na stałe w * ), klauzula where (generowana z dwóch klauzul z & do wygenerowania SQL AND klauzula) oraz listę elementów do wyboru; tutaj twój jedyny sqlalchemy.sql.table() wartość.

Szybka prezentacja:

>>> 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 rzeczywiste drzewo obiektów wygenerowane z tego wszystkiego zawiera również rzeczywiste wartości parametrów wiązania, więc my_sess.execute() mogą uzyskać do nich bezpośredni dostęp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najlepszy sposób radzenia sobie z błędami pisowni w wyszukiwaniu pełnotekstowym MySQL

  2. Zmień krok auto_increment pól inkrementacji o

  3. PHP Foreach w zestawie wyników MySQLi

  4. Indeks złożony dla tabeli relacji

  5. Instalowanie MySQL na serwerze VPS i łączenie się z innymi serwerami