Nej, SQL-parametre beskæftiger sig kun med skalar værdier. Du bliver nødt til at generere SQL her; hvis du har brug for rå SQL, skal du bruge:
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()
for eksempel. generere nok parametre til at indeholde alle værdier i some_list
med strengformatering, og generer derefter matchende parametre for at udfylde dem.
Endnu bedre ville være at bruge en literal_column()
objekt
for at gøre al genereringen for dig:
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()
men så kunne du måske bare generere hele sætningen ved hjælp af `sqlalchemy.sql.expression-modulet, da dette ville gøre understøttelse af flere databasedialekter meget nemmere.
Desuden er uid_in
objektet indeholder allerede referencer til de rigtige værdier for bindeparametrene; i stedet for at gøre det til en streng, som vi gør med str.format()
handling ovenfor, ville SQLAlchemy have det faktiske objekt plus de tilknyttede parametre, og du ville ikke længere skulle generere params
ordbog enten .
Følgende burde virke:
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]))
hvor sqlalchemy.sql.select()
tager en kolonnespecifikation (her hårdkodet til *
), en where-sætning (genereret ud fra de to sætninger med &
at generere en SQL AND
klausul) og en liste over valgbare; her er din ene sqlalchemy.sql.table()
værdi.
Hurtig 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)
men det faktiske objekttræ, der genereres ud fra alt dette, indeholder også de faktiske værdier for bindeparametrene, så my_sess.execute()
kan få direkte adgang til disse.