Estoy usando pyodbc para consultar un AS400 (desafortunadamente), ¡y algunos nombres de columnas tienen hashes! Aquí hay un pequeño ejemplo:

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

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

Obviamente tengo errores como este:

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

¿Hay alguna forma de escapar de esto? Parece dudoso que incluso un hash esté permitido en un nombre var. Acabo de comprar Python hoy, así que perdóname si la respuesta es de conocimiento común.

Gracias pete

3
slypete 19 jul. 2009 a las 22:52

4 respuestas

La mejor respuesta

Use la función getattr

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

Esta es, en general, la forma en que manejas los atributos que no son identificadores legales de Python. Por ejemplo, puedes decir

setattr(p, "&)(@#$@!!~%&", "Hello World!")
print getattr(p, "&)(@#$@!!~%&")  # prints "Hello World!"

Además, como sugiere JG, puede dar a sus columnas un alias, como diciendo

SELECT LPPDR# AS LPPDR ...
7
Eli Courtwright 19 jul. 2009 a las 18:54

Puede intentar darle a la columna un alias, es decir:

 self.cursor.execute('select LPPLNM, LPPDR# as LPPDR from BSYDTAD.LADWJLFU')
5
João Silva 19 jul. 2009 a las 18:54

self.cursor.execute devuelve una tupla, por lo que esto también funcionaría:

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

Pero prefiero las otras respuestas :-)

2
Vorsprung durch Technik 19 jul. 2009 a las 18:59

La pregunta ha sido respondida, pero esta es solo otra alternativa (basada en la respuesta de Adam Bernier + desempaquetado de tuplas) que creo que es la más limpia:

for row in self.cursor:
    p = Patient()
    p.last, p.pcp = row
1
dF. 19 jul. 2009 a las 23:47