2010-12-09 4 views
1

J'ai une requête SQL, folle en Python en utilisant Psycopg2. La requête lit des colonnes de la table arches:Python, SQL: Définir les colonnes lues comme paramètre

rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+" 
          FROM arches 
          WHERE lower(arch) like '%%%s%%'""" % (arch.lower())) 

Je veux paramètrer cette requête, afin qu'il ne précise pas les colonnes nécessaires en utilisant la concaténation de chaîne, mais en tant que paramètres - de façon beaucoup plus élégante.

La façon naïve est de SELECT *, et de filtrer les colonnes dont j'ai besoin. Mais cela alourdit la BD et le réseau avec des données inutiles, donc je l'évite plutôt.

Des idées?

Adam

Répondre

2

Les noms de colonne ne peuvent pas être transmis dans la chaîne SQL en tant que paramètres dans l'API DB. Et ça n'aurait pas de sens pour ça aussi.

Si vous devez vérifier l'entrée du nom de la colonne, désinfectez-la au préalable.

La chaîne comme devrait aller en tant que paramètre si

L'exemple de code suivant serait une amélioration si la variable de colonnes contient une liste de chaînes pour les noms de colonnes:

rows = archesDB.read_all("""SELECT %s 
         FROM arches 
         WHERE lower(arch) like %%s""" % (",".join(columns),), 
         ("%%%s%%" % (arch.lower(),),)) 

Tout d'abord, la colonne les noms sont insérés dans la première substitution (% s) et le dernier %% s est converti en% s. Ensuite, le ("%%% s %%"% (arch.lower(),),) crée une chaîne avec% string_content%. Et enfin, db api échappe à% string_content% et ajoute des guillemets pour finalement faire la requête.

0

Vous ne pouvez pas paramétrer les métadonnées. Créez un mappage d'un identificateur vers la liste de champs souhaitée et utilisez-le.

+0

Autrement dit, utilisez 'SELECT *' et filtrez les colonnes souhaitées? –

+0

Un mappage. Comme un dict. Et puis obtenir la liste des champs pour mettre dans la requête de cela. –

Questions connexes