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.