Mysql
 sql >> база данни >  >> RDS >> Mysql

SQLAlchemy WHERE IN единична стойност (суров SQL)

Не, SQL параметрите се занимават само със скалар стойности. Ще трябва да генерирате SQL тук; ако имате нужда от необработен SQL, използвайте:

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

напр. генерирайте достатъчно параметри, за да задържите всички стойности в some_list с форматиране на низ, след което генерирайте съответстващи параметри, за да ги попълните.

Още по-добре би било да използвате literal_column() обект да направи цялото генериране вместо вас:

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

но тогава може би бихте могли просто да генерирате целия израз, като използвате модула `sqlalchemy.sql.expression, тъй като това би направило поддържането на множество диалекти на база данни много по-лесно.

Освен това uid_in обектът вече съдържа препратки към правилните стойности за параметрите на свързване; вместо да го превръщаме в низ, както правим с str.format() действие по-горе, SQLAlchemy ще има действителния обект плюс свързаните параметри и вече няма да се налага да генерирате params речник или .

Следното трябва да работи:

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

където sqlalchemy.sql.select() приема спецификация на колона (тук твърдо кодирана на * ), клауза where (генерирана от двете клаузи с & за генериране на SQL AND клауза) и списък с избираеми; тук е вашият sqlalchemy.sql.table() стойност.

Бърза демонстрация:

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

но действителното дърво на обектите, генерирано от всичко това, съдържа и действителните стойности за параметрите на свързване, така че my_sess.execute() имат директен достъп до тях.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обратно инженерство на mysql база данни за създаване на приложение django

  2. Изчисляване на процент в MYSQL заявка въз основа на условия

  3. Unicode Encode Error „latin-1“ Кодекът не може да кодира символ „\u2019“

  4. Как да конвертирате .db файл в .sql файл

  5. Защо този SQL INSERT израз връща синтактична грешка?