Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/init.php on line 563
variables_sqlite3 [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


variables_sqlite3

Ceci est une ancienne révision du document !



Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/parser/handler.php on line 1458

Warning: preg_match(): Compilation failed: invalid range in character class at offset 3565 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/parser/lexer.php on line 118
A PCRE internal error occured. This might be caused by a faulty plugin

====== Ajouter des variables à sqlite3 ====== ===== Problématique ===== Dans certains scripts SQL pour sqlite3, on est obligé de calculer plusieurs fois la même valeur. Lorsque cette recherche est complexe, par exemple une sous-requête, cela constitue une perte de temps et de complexité qu'on cherche à éviter. Un exemple est un script d'extraction avec SELECT, contenant une sous-requête dans un CASE si on doit la mettre en même temps dans le WHEN pour la condition et dans le THEN pour l'affichage: <code>CASE WHEN sousreq != '' THEN sousreq ELSE 'Non disponible' END </code> Il y a des solutions "classiques" comme de créer une table temporaire ou de repousser la sous-requête plus loin, mais cela ne simplifie pas le script. Comme nous sommes sous Python, nous allons créer les fonctions qui vont bien pour déclarer et utiliser des variables, et les "accrocher" à sqlite3 avec la méthode "create_function" du pilote Python. ===== Solution ===== Voilà la solution proposée: <code python>class Varsql(object): """déclaration et utilisation de variables dans sqlite3 """ def __init__(self): """initialise le dictionnaire des variables """ self.dicovar = {} def set_var(self, var, val): """cree la variable var et lui affecte la valeur val """ self.dicovar[var] = val return val def get_var(self, var): """retourne la valeur val de la variable var si elle existe sinon, retourne None """ if var in self.dicovar: return self.dicovar[var] else: return None varsql = Varsql() # instanciation de la classe </code> Et on déclare varsql à chaque ouverture de la base (ici, cnx est la variable de connexion) avec: <code python>cnx.create_function("set_var", 2, varsql.set_var) cnx.create_function("get_var", 1, varsql.get_var) </code> Grâce à cette double déclaration, nous pourrons utiliser set_var et get_var directement dans les scrips SQL pour sqlite3. Bien sûr, il faut avoir conscience des caractéristiques de cette technique: le dictionnaire des variables ainsi créé est global pour le script, et chaque nouvelle valeur affectée à une même variable écrase la précédente. Juste un petit exemple pour vérifier que ça marche. Nous avons une table "test" avec un champ "mots". Nous voulons seulement répéter 2 fois le champ cherché sans le calculer 2 fois ("cur" est ici un curseur): <code python> cur.execute(""" SELECT set_var('x', mots), get_var('x') FROM test """) </code> Dans le résultat de cette requête, chaque ligne sera composée de 2 champs, le 2ème étant identique au 1er mais calculé qu'une seule fois. J'utilise maintenant cette technique dans certain scripts complexes, et ça résout très bien le problème: gain de temps et de complexité! \\ Amusez-vous bien! <html> <head> <style type="text/css"> <!-- body {background-image:url(fondcorps.jpg);} --> </style> </head> <body> </body> </html>

variables_sqlite3.1425449574.txt.gz · Dernière modification: 2015/03/04 07:12 par tyrtamos

Outils de la page