Py MySQL Query возвращает причудливый словарь - PullRequest
0 голосов
/ 09 марта 2020

Проблема

Я использую Py MYSQL для запроса базы данных, используя следующую функцию SQL translater.

def retrieve_column(lotkey, column="active",print = False):
    result = None
    try:
        connection = sql_connect()
        with connection.cursor() as cursor:
            # Create a new record
            sql = "SELECT %s FROM table_n"
            val = (column)
            os_print(sql + '\r\n...', end='', style='dim', flush=True)
            cursor.execute(sql, val)
            result = cursor.fetchall()
            connection.close()
    except Exception as e:
        os_print(e, style='error')
        os_print("ERROR: Can't connect to database!", style='error', tts='error')
    return result

Который я вызываю и печатаю, используя следующие строки. Примечание: Столбец 'active' имеет логическое значение.

active_col = retrieve_column(key)
print(active_col)

Что выводит следующий причудливый результат. Кажется, это словарь, в котором нет значений.

...[{'active': 'active'}, {'active': 'active'}, {'active': 'active'}, {'active': 'active'}, {'active': 'active'}, {'active': 'active'}, {'active': 'active'}]

Попытки решения

Моим первым шагом было выполнение того же запроса в MySQL верстаке, который выдал следующий результат.

Workbench Query Это примерно то, что я пытаюсь воспроизвести в Python (Получение словаря с логическим значением каждой строки).

Далее я использовал отладчик python и обнаружил, что действительно возвращаемые значения из cursor.fetchall() являются пустыми словарями, в которых нет ничего, кроме одного ключа и никаких значений.

Кто-нибудь сталкивался с чем-то подобным раньше?

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

На самом деле, используя эти три инструкции:

sql = "SELECT %s FROM table_n"
val = (column)
cursor.execute(sql, val)

Вы получите следующий запрос:

SELECT 'column' FROM table_n

Результатом является список значений столбца (имя столбца также «столбец»). Поскольку параметры метода cursor.execute () являются не литералами , а параметром значения (в данном случае строковое значение 'столбец')

Если вы пытаетесь выбрать значение столбца, вам нужно отформатировать содержимое запроса SQL, а не параметры:

sql = "SELECT {colname} FROM table_n"
sql.format( colname = column )
cursor.execute(sql)
0 голосов
/ 09 марта 2020

Имена столбцов не могут быть переданы cursor так же, как значения аргументов могут быть переданы. Для этого вам действительно нужно отформатировать строку запроса.

sql = "SELECT {} FROM table_n".format(column)
cursor.execute(sql)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...