2011-07-25 9 views
5
SELECT * FROM a, b WHERE ... 

Mysql permite nombres de columna duplicados en los resultados de una consulta. Por lo tanto, en el terminal, ninguno de los nombres de columna tiene el prefijo usando la consulta anterior.forzar mysqldb dict cursor para devolver prefijo todos los nombres de columna con el nombre de tabla

Sin embargo, estoy usando mysqldb en python con el DictCursor. Los resultados son una lista de diccionarios donde los nombres de las columnas son las claves. Algunas veces, el cursor dict automáticamente prefija el nombre de la columna con el nombre de la tabla. Por lo que puedo decir, hace esto para el segundo de dos nombres de columna ambiguos, pero solo si el segundo valor es único. De todos modos, me gustaría forzar al cursor a prefijar TODAS las teclas con el nombre de la tabla.

Desde el mysqldb docs en la función fetch.row() ...

El segundo parámetro (cómo) dice que la forma en la fila deben estar representados. De forma predeterminada, es cero lo que significa, devolver como una tupla. cómo = 1 significa, devolverlo como un diccionario, donde las claves son los nombres de las columnas, o table.column si hay dos columnas con el mismo nombre (por ejemplo, de un join). how = 2 significa lo mismo que how = 1 excepto que las claves son siempre table.column; esto es por compatibilidad con el antiguo módulo Mysqldb.

Por lo tanto, parece factible, pero no estoy usando directamente la función fetch.row() ... así que la pregunta es, ¿cómo puedo que el cursor MySQLdb dict a utilizar siempre la forma = 2 cuando ¿trae filas?

+1

I don' Conozco Python, pero si ejecuta la consulta en una consola, ¿todavía obtiene el prefijo de la tabla para las columnas ambiguas? – Karolis

+0

@Karolis esa es la pregunta correcta, gracias ... para empezar, parece que mysql permite duplicar los nombres de las columnas, por lo que se trata de una cuestión en parte confidencial. – jmilloy

Respuesta

2

No soy un gran fan de usar * en las consultas. Enumere sus columnas y asigne sus propios alias según sea necesario. Como verá, tampoco soy partidario de uniones implícitas.

SELECT a.col1 AS acol1, 
     a.col2 AS acol2, 
     b.col1 AS bcol1, 
     b.col2 AS bcol2 
    FROM a 
     INNER JOIN b 
      ON ... 
    WHERE... 
+1

Tienes razón, estoy siendo un poco flojo. ¿Eres estricto con esto sin importar cuántas columnas necesites? – jmilloy

+0

@jmilloy: Lo soy. Nunca quiero que se rompa una consulta porque se agregó una nueva columna a una tabla y 'SELECT *' recogió inesperadamente esa nueva columna. –

1

Dado un diccionario (o alguna otra estructura de datos) que enumera las tablas y los campos de forma explícita, la construcción del SQL no es demasiado difícil:

import itertools as it 

fields={'a':('col1','col2'),'b':('col1','col3')} 

fields_sql=', '.join("{t}.{f} as '{t}.{f}'".format(f=f,t=t) 
        for t in fields for f in fields[t]) 
sql='''SELECT {f} 
    FROM a 
     JOIN b ON ... 
    WHERE ...'''.format(f=fields_sql) 
print(sql) 

produce

SELECT a.col1 as 'a.col1', a.col2 as 'a.col2', b.col1 as 'b.col1', b.col3 as 'b.col3' 
    FROM a 
     JOIN b ON ... 
    WHERE ... 
Cuestiones relacionadas