sql >> Database teknologi >  >> RDS >> Mysql

SQLAlchemy WHERE IN enkelt værdi (rå SQL)

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.




  1. MAX() – Find den maksimale værdi i en kolonne i MySQL

  2. MySQL-tabel som en FIFO/kø

  3. Hvordan kan jeg få listen over databaser i Postgresql i python

  4. Java mySQL med 000webhost