2009-07-19 7 views
3

J'utilise pyodbc pour interroger un AS400 (malheureusement), et certains noms de colonnes contiennent des hachages! Voici un petit exemple:Comment échapper un hachage (#) en python?

self.cursor.execute('select LPPLNM, LPPDR# from BSYDTAD.LADWJLFU') 

for row in self.cursor: 
    p = Patient() 
    p.last = row.LPPLNM 
     p.pcp = row.LPPDR# 

Je reçois des erreurs comme celle-ci de toute évidence:

AttributeError: 'pyodbc.Row' object has no attribute 'LPPDR' 

Y at-il un moyen d'échapper à cela? Semble douteux qu'un hachage est même autorisé dans un nom de var. Je viens de ramasser python aujourd'hui, alors pardonnez-moi si la réponse est de notoriété publique.

Merci, Pete

Répondre

7

Utilisez la fonction getattr

p.pcp = getattr(row, "LPPDR#") 

Ceci est, en général, la façon dont vous traitez avec des attributs qui ne sont pas des identifiants Python juridiques. Par exemple, vous pouvez dire

setattr(p, "&)(@#[email protected]!!~%&", "Hello World!") 
print getattr(p, "&)(@#[email protected]!!~%&") # prints "Hello World!" 

, comme JG suggère également, vous pouvez donner à vos colonnes un alias, comme en disant

SELECT LPPDR# AS LPPDR ... 
+0

Fonctionne très bien, merci beaucoup! – slypete

5

Vous pouvez essayer de donner la colonne un alias, à savoir:

self.cursor.execute('select LPPLNM, LPPDR# as LPPDR from BSYDTAD.LADWJLFU') 
2

self.cursor.execute retourne un tuple, donc cela fonctionnerait aussi:

for row in self.cursor: 
     p = Patient() 
     p.last = row[0] 
     p.pcp = row[1] 

Mais je préfère les autres réponses :-)

1

La question a été répondu, mais ce n'est une autre alternative (fonction de la réponse + le déballage tuple d'Adam Bernier) que je pense est la plus propre:

for row in self.cursor: 
    p = Patient() 
    p.last, p.pcp = row