2010-04-30 7 views
1

J'ai une variable de classe appelées attributs qui énumère les variables d'instance que je veux mettre à jour dans une base de données:moyen efficace de construire une requête de mise à jour MySQL en Python

attributes = ['id', 'first_name', 'last_name', 'name', 'name_url', 
       'email', 'password', 'password_salt', 'picture_id'] 

Chacun des attributs de classe sont mis à jour à l'instanciation.

Je voudrais faire une boucle à travers chacun des attributs et construire une requête de mise à jour MySQL sous forme de:

UPDATE members SET id = self._id, first_name = self._first name ... 

Merci.

Répondre

3
class Ic(object): 
    attributes = ['id', 'first_name', 'last_name', 'name', 'name_url', 
       'email', 'password', 'password_salt', 'picture_id'] 

    def __init__(self): ... 

    # and other methods that set all the attributes on self 

    def updater(self): 
    sqlbase = 'UPDATE members SET %s WHERE whateveryouwanthere' 
    setpieces = [] 
    values = [] 
    for atr in self.attributes: 
     setpieces.append('%s = ?' % atr) 
     values.append(getattr(self, atr, None)) 
    return sqlbase % ', '.join(setpieces), values 

L'appelant doit construire un objet de classe Ic appropriée, puis faire

sql, values = theobj.updater() 

et enfin appel mycursor.execute(sql, values) sur ce que le curseur API DB, il a à la base de données qui doit être mis à jour (I Je n'ai aucune idée des conditions WHERE que vous voulez utiliser pour identifier l'enregistrement sepcifique à mettre à jour, c'est pourquoi j'ai mis un espace réservé whatreveryouwanthere là ;-).

+0

Salut Alex - Merci. Comment puis-je modifier ce code pour inclure également "WHERE id = 123" ... Idéalement, le sqlbase devrait lire: sqlbase = 'UPDATE membres SET% s WHERE id =% s' mais je ne suis pas sûr de savoir comment gérer ce second% s pour le remplacement avec l'id. Je vous remercie! – ensnare

+0

@ensnare, si votre 'whatyouwanthere' a un' id =? ', Ajoutez la valeur que vous voulez pour' id' à 'values' (après la boucle' for' et juste avant 'return'). Cela n'a aucun sens d'utiliser '% s' lorsque la substitution de valeur normale marche bien! –

0

Première question: toutes les variables des attributs seront-elles utilisées? Si c'est le cas, le plus simple est probablement d'utiliser la méthode d'exécution de DBAPI.

en supposant que votre curseur est instancié comme rse:

sql="UPDATE mytable SET phone=? where username=?" 
variables = ("a phone number","a username") 
csr.execute(sql,variables) 

Il y a d'autres façons de le faire, comme l'utilisation des dictionnaires, des indicateurs de position, etc .. voir DBAPI FAQ pour plus de détails.

Questions connexes