заставить mysqldb dict cursor возвращать префикс всех имен столбцов с именем таблицы

SELECT * FROM a, b WHERE ... 

Mysql позволяет дублировать имена столбцов в результатах запроса. Таким образом, в терминале ни одно из имен столбцов не имеет префикса, используя указанный выше запрос.

Тем не менее, я использую mysqldb в python с DictCursor. Результатом является список словарей, в которых имена столбцов являются ключами. Иногда указатель dict автоматически префикс имени столбца с именем таблицы. Насколько я могу судить, он делает это для второго из двух неоднозначных имен столбцов, но только если второе значение уникально. В любом случае, я хотел бы заставить курсор префикс ALL ключей с именем таблицы.

Из документов mysqldb в функции fetch.row () …

Второй параметр (как) сообщает ему, как должна отображаться строка. По умолчанию оно равно нулю, а значит, возвращает как кортеж. как = 1 означает, возвращает его как словарь, где ключи являются именами столбцов или table.column, если есть два столбца с одинаковым именем (например, из объединения). how = 2 означает то же, что и как = 1, за исключением того, что ключи всегда являются table.column; это для совместимости со старым модулем Mysqldb.

Таким образом, это кажется выполнимым, но я не использую функцию fetch.row () напрямую … так что вопрос в том, как я могу заставить курсор mysqldb dict всегда использовать how = 2, когда он извлекает строки?

Я не большой поклонник использования * в запросах. Перечислите свои столбцы и назначьте свои собственные псевдонимы по мере необходимости. Как вы увидите, я также не поклонник неявных объединений.

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

Учитывая диктовку (или некоторую другую структуру данных), которая явно перечисляет таблицы и поля, построение SQL не слишком сложно:

 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) 

доходность

 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 ...