Nej, SQL-parametrar hanterar bara skalär värden. Du måste generera SQL här; om du behöver rå SQL, använd:
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()
t.ex. generera tillräckligt med parametrar för att hålla alla värden i some_list
med strängformatering, generera sedan matchande parametrar för att fylla dem.
Ännu bättre skulle vara att använda en literal_column()
objekt
för att göra all generering åt 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 då kan du kanske bara generera hela satsen med hjälp av modulen `sqlalchemy.sql.expression, eftersom detta skulle göra stöd för flera databasdialekter mycket lättare.
Dessutom är uid_in
objektet innehåller redan referenser till rätt värden för bindningsparametrarna; istället för att förvandla den till en sträng som vi gör med str.format()
åtgärden ovan skulle SQLAlchemy ha det faktiska objektet plus de associerade parametrarna och du skulle inte längre behöva generera params
ordbok antingen .
Följande bör fungera:
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]))
där sqlalchemy.sql.select()
tar en kolumnspecifikation (här hårdkodad till *
), en where-sats (genererad från de två satserna med &
för att generera en SQL AND
klausul) och en lista över valbara; här är din ena sqlalchemy.sql.table()
värde.
Snabb 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 faktiska objektträdet som genereras från allt detta innehåller de faktiska värdena för bindningsparametrarna också, så my_sess.execute()
kan komma åt dessa direkt.