Не, SQL параметрите се занимават само със скалар стойности. Ще трябва да генерирате SQL тук; ако имате нужда от необработен SQL, използвайте:
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()
напр. генерирайте достатъчно параметри, за да задържите всички стойности в some_list
с форматиране на низ, след което генерирайте съответстващи параметри, за да ги попълните.
Още по-добре би било да използвате literal_column()
обект
да направи цялото генериране вместо вас:
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()
но тогава може би бихте могли просто да генерирате целия израз, като използвате модула `sqlalchemy.sql.expression, тъй като това би направило поддържането на множество диалекти на база данни много по-лесно.
Освен това uid_in
обектът вече съдържа препратки към правилните стойности за параметрите на свързване; вместо да го превръщаме в низ, както правим с str.format()
действие по-горе, SQLAlchemy ще има действителния обект плюс свързаните параметри и вече няма да се налага да генерирате params
речник или .
Следното трябва да работи:
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]))
където sqlalchemy.sql.select()
приема спецификация на колона (тук твърдо кодирана на *
), клауза where (генерирана от двете клаузи с &
за генериране на SQL AND
клауза) и списък с избираеми; тук е вашият sqlalchemy.sql.table()
стойност.
Бърза демонстрация:
>>> 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)
но действителното дърво на обектите, генерирано от всичко това, съдържа и действителните стойности за параметрите на свързване, така че my_sess.execute()
имат директен достъп до тях.