sql >> Databasteknik >  >> RDS >> Mysql

SQLAlchemy WHERE IN enstaka värde (rå SQL)

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.




  1. Leverera snabbare innovation till MariaDB:s community

  2. ORA-29024:Certifikatvalideringsfel

  3. Hur tar man Count (*) som variabel från SQL till php?

  4. C# Oracle Stored Procedure Parameter Order