2012-04-17 24 views
28

¿Hay alguna forma de recuperar el valor de la columna de resultados de SQL utilizando el nombre de columna en lugar del índice de columna en Python? Estoy usando Python 3 con mySQL. La sintaxis que estoy buscando es más o menos como la construcción de Java:¿Cómo recuperar el valor de la columna de resultado SQL usando el nombre de la columna en Python?

Object id = rs.get("CUSTOMER_ID"); 

tengo una mesa con un buen número de columnas y es un verdadero dolor de cabeza para trabajar constantemente el índice para cada columna que necesito acceder. Además, el índice está dificultando la lectura de mi código.

Gracias!

+0

Usted Es posible que desee proporcionar más detalles como el código que está intentando, el paquete Python que está utilizando. – Shekhar

Respuesta

52

El módulo tiene una MySQLdbDictCursor:

utilizar de esta manera (tomado de Writing MySQL Scripts with Python DB-API):

cursor = conn.cursor(MySQLdb.cursors.DictCursor) 
cursor.execute("SELECT name, category FROM animal") 
result_set = cursor.fetchall() 
for row in result_set: 
    print "%s, %s" % (row["name"], row["category"]) 

editar: Según user1305650 esto también funciona para pymysql.

+6

Intenté esto y no funciona demasiado - Obtuve un error "TypeError: los índices de tupla deben ser enteros, no str" – Thomas

+2

¿Está utilizando el módulo 'MySQLdb'? ¿Creó su cursor exactamente así: 'cursor = conn.cursor (MySQLdb.cursors.DictCursor)'? –

+0

mi mal! No creé el cursor según tu publicación. Funciona ahora - Solo necesito cambiar MySQLdb.cursors.DictCursor por pymysql.cursors.DictCursor porque utilizo pymysql. ¡Gracias! – Thomas

-1

Por supuesto que sí. En Python 2.7.2 + ...

import MySQLdb as mdb 
con = mdb.connect('localhost', 'user', 'password', 'db'); 
cur = con.cursor() 
cur.execute('SELECT Foo, Bar FROM Table') 
for i in range(int(cur.numrows)): 
    foo, bar = cur.fetchone() 
    print 'foo = %s' % foo 
    print 'bar = %s' % bar 
+1

-1. Lo siento, en serio dudas eso es lo que OP significaba. –

+0

¿Qué crees que está tratando de hacer? Seleccionar los valores por nombre de columna y asignarlos a las variables parece bastante sencillo. – TaoJoannes

+0

Parece que quiere una solución que sea independiente del orden de las columnas. –

0

usted no proporcionó muchos detalles, pero se puede intentar algo como esto:

# conn is an ODBC connection to the DB 
dbCursor = conn.cursor() 
sql = ('select field1, field2 from table') 
dbCursor = conn.cursor() 
dbCursor.execute(sql) 
for row in dbCursor: 
    # Now you should be able to access the fields as properties of "row" 
    myVar1 = row.field1 
    myVar2 = row.field2 
conn.close() 
+0

lo siento, no funciona. Aunque no estoy seguro de si es porque la implementación mySQL o simplemente DB-API-2.0 no la soportan. – Thomas

+0

¿Has probado usar pyodbc? Debe ser genérico y admitir la misma interfaz para cada base de datos. – Diego

-1

pitón 2,7

import pymysql 

conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='password', db='sakila') 

cur = conn.cursor() 

n = cur.execute('select * from actor') 
c = cur.fetchall() 

for i in c: 
    print i[1] 
+0

OP desea por atributo no índice – levi

2

Este post es antiguo, pero puede llegar a través de la búsqueda.

Ahora puede utilizar mysql.connector retrive un diccionario, como se muestra aquí: https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursordict.html

Aquí es el ejemplo en el sitio de MySQL:

cnx = mysql.connector.connect(database='world') 
cursor = cnx.cursor(dictionary=True) 
cursor.execute("SELECT * FROM country WHERE Continent = 'Europe'") 

print("Countries in Europe:") 
for row in cursor: 
    print("* {Name}".format(Name=row['Name'] 
1

pymysql importación

# Open database connection 
db = pymysql.connect("localhost","root","","gkdemo1") 

# prepare a cursor object using cursor() method 
cursor = db.cursor() 

# execute SQL query using execute() method. 
cursor.execute("SELECT * from user") 

# Get the fields name (only once!) 
field_name = [field[0] for field in cursor.description] 

# Fetch a single row using fetchone() method. 
values = cursor.fetchone() 

# create the row dictionary to be able to call row['login'] 
**row = dict(zip(field_name, values))** 

# print the dictionary 
print(row) 

# print specific field 
print(**row['login']**) 

# print all field 
for key in row: 
    print(**key," = ",row[key]**) 

# close database connection 
db.close() 
Cuestiones relacionadas