SQLAlchemy Core - Usando SQL Textual

SQLAlchemy permite que você use apenas strings, para aqueles casos em que o SQL já é conhecido e não há uma grande necessidade de que a instrução suporte recursos dinâmicos. A construção text () é usada para compor uma declaração textual que é passada para o banco de dados praticamente inalterada.

Ele constrói um novo TextClause, representando uma string SQL textual diretamente conforme mostrado no código a seguir -

from sqlalchemy import text
t = text("SELECT * FROM students")
result = connection.execute(t)

As vantagens text() fornece sobre uma string simples são -

  • suporte neutro de backend para parâmetros de ligação
  • opções de execução por instrução
  • comportamento de digitação de coluna de resultado

A função text () requer parâmetros Bound no formato de dois pontos nomeado. Eles são consistentes, independentemente do back-end do banco de dados. Para enviar valores para os parâmetros, nós os passamos para o método execute () como argumentos adicionais.

O exemplo a seguir usa parâmetros vinculados em SQL textual -

from sqlalchemy.sql import text
s = text("select students.name, students.lastname from students where students.name between :x and :y")
conn.execute(s, x = 'A', y = 'L').fetchall()

A função text () constrói a expressão SQL da seguinte maneira -

select students.name, students.lastname from students where students.name between ? and ?

Os valores de x = 'A' ey = 'L' são passados ​​como parâmetros. O resultado é uma lista de linhas com nomes entre 'A' e 'L' -

[('Komal', 'Bhandari'), ('Abdul', 'Sattar')]

A construção text () oferece suporte a valores de limite pré-estabelecidos usando o método TextClause.bindparams (). Os parâmetros também podem ser digitados explicitamente da seguinte forma -

stmt = text("SELECT * FROM students WHERE students.name BETWEEN :x AND :y")

stmt = stmt.bindparams(
   bindparam("x", type_= String), 
   bindparam("y", type_= String)
)

result = conn.execute(stmt, {"x": "A", "y": "L"})

The text() function also be produces fragments of SQL within a select() object that 
accepts text() objects as an arguments. The “geometry” of the statement is provided by 
select() construct , and the textual content by text() construct. We can build a statement 
without the need to refer to any pre-established Table metadata. 

from sqlalchemy.sql import select
s = select([text("students.name, students.lastname from students")]).where(text("students.name between :x and :y"))
conn.execute(s, x = 'A', y = 'L').fetchall()

Você também pode usar and_() função para combinar várias condições na cláusula WHERE criada com a ajuda da função text ().

from sqlalchemy import and_
from sqlalchemy.sql import select
s = select([text("* from students")]) \
.where(
   and_(
      text("students.name between :x and :y"),
      text("students.id>2")
   )
)
conn.execute(s, x = 'A', y = 'L').fetchall()

O código acima busca linhas com nomes entre “A” e “L” com id maior que 2. A saída do código é fornecida abaixo -

[(3, 'Komal', 'Bhandari'), (4, 'Abdul', 'Sattar')]