SQLAlchemy Core - Utilisation de SQL textuel

SQLAlchemy vous permet d'utiliser uniquement des chaînes, dans les cas où le SQL est déjà connu et où il n'est pas nécessaire que l'instruction prenne en charge les fonctionnalités dynamiques. La construction text () est utilisée pour composer une instruction textuelle qui est passée à la base de données pratiquement inchangée.

Il construit un nouveau TextClause, représentant une chaîne SQL textuelle directement comme indiqué dans le code ci-dessous -

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

Les avantages text() fournit sur une chaîne simple sont -

  • support neutre du backend pour les paramètres de liaison
  • options d'exécution par instruction
  • comportement de typage de la colonne de résultats

La fonction text () nécessite des paramètres Bound au format deux-points nommé. Ils sont cohérents quel que soit le backend de la base de données. Pour envoyer des valeurs pour les paramètres, nous les passons dans la méthode execute () comme arguments supplémentaires.

L'exemple suivant utilise des paramètres liés dans SQL textuel -

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

La fonction text () construit l'expression SQL comme suit -

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

Les valeurs de x = 'A' et y = 'L' sont transmises comme paramètres. Le résultat est une liste de lignes avec des noms entre 'A' et 'L' -

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

La construction text () prend en charge les valeurs liées préétablies à l'aide de la méthode TextClause.bindparams (). Les paramètres peuvent également être explicitement typés comme suit -

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

Vous pouvez aussi utiliser and_() fonction pour combiner plusieurs conditions dans la clause WHERE créée à l'aide de la fonction 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()

Le code ci-dessus récupère les lignes avec des noms entre «A» et «L» avec un identifiant supérieur à 2. La sortie du code est donnée ci-dessous -

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