sql >> Database >  >> RDS >> Mysql

SQLAlchemy WHERE IN enkele waarde (onbewerkte SQL)

Nee, SQL-parameters hebben alleen betrekking op scalar waarden. Je zult hier de SQL moeten genereren; als je onbewerkte SQL nodig hebt, gebruik dan:

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()

bijv. genereer voldoende parameters om alle waarden in some_list te bewaren met tekenreeksopmaak en genereer vervolgens overeenkomende parameters om ze te vullen.

Nog beter zou zijn om een ​​literal_column() voorwerp om al het genereren voor u te doen:

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()

maar dan zou je misschien gewoon de hele instructie kunnen genereren met behulp van de module `sqlalchemy.sql.expression, omdat dit het ondersteunen van meerdere databasedialecten veel gemakkelijker zou maken.

Bovendien is de uid_in object bevat al verwijzingen naar de juiste waarden voor de bindparameters; in plaats van er een string van te maken zoals we doen met de str.format() actie hierboven, zou SQLAlchemy het eigenlijke object plus de bijbehorende parameters hebben en zou u niet langer de params hoeven te genereren woordenboek ofwel .

Het volgende zou moeten werken:

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]))

waar de sqlalchemy.sql. select() neemt een kolomspecificatie (hier hard gecodeerd naar * ), een waar-clausule (gegenereerd uit de twee clausules met & om een ​​SQL AND . te genereren clausule) en een lijst met selecteerbare items; hier jouw ene sqlalchemy.sql .table() waarde.

Snelle 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)

maar de werkelijke objectboom die uit dit alles wordt gegenereerd, bevat ook de werkelijke waarden voor de bindparameters, dus my_sess.execute() kan deze rechtstreeks openen.




  1. DateTime-fout bij invoegen in MySQL

  2. MySQL verwijder rij uit meerdere tabellen

  3. Tel inhoud in jaarmaandarchief met behulp van PHP

  4. Variabele krijgt NULL na berekeningen in MySQL Trigger