2016-06-10 4 views
0

У меня есть список имен столбцов, которые я хочу извлечь из базы данных mysql. Хорошая практика заключается в том, чтобы проходить через него и запрашивать каждый раз?Python, запрашивающий mysql итеративно

Когда я это делаю, иногда/в случайном порядке кажется, что он висит; когда я перезапускаю скрипт, он зависает при разных итерациях. Интересно, стоит ли делать это в первую очередь, прежде чем я продолжу попытки понять, в чем проблема.

import mysql.connector 
import numpy as np 

cnx = mysql.connector.connect(user='user', password='pw', host='ip_here') 
for i,j in enumerate(columnList): 
    cursor.execute('SELECT `' + j + '` FROM `table_name`') 
    iValues = cursor.fetchall() 
    cursor.close 
    if i == 0: 
     extractedValues = iValues 
    else: 
     extractedValues = np.hstack((extractedValues, iValues)) 

cnx.close 
+0

Не знаете, кто вам сказал, чтобы пройти через базу данных. Это не очень хорошая идея. Fetchall все данные, необходимые локально или в памяти, и циклические данные. 200 элементов в столбце означают 400 попыток и обратно из стихов db только два. Это должно устранить проблему. – Merlin

ответ

2

Это очень странно опрашивать отдельные столбцы по одному за раз, так как вы не сможете связать значения в одном столбце в другой. Если ваша таблица не является захватом несвязанных данных (на самом деле нет записей, т. Е. Ваша таблица вообще не нормализована), это приведет к удалению всего значения из данных. Если вы пытаетесь использовать динамические или переменные столбцы, вы можете создать динамическую строку запроса (добавить имя столбца, запятую, имя столбца, запятую ...), затем выполнить этот запрос. Мне трудно думать о сценариях, где полезно запрашивать отдельные столбцы, а не строки/записи.

+0

Спасибо Крису за это; раньше не думал об этом. Для меня больше смысла иметь текущие столбцы в виде строк и наоборот, но, к сожалению, мои данные не соответствуют текущим ограничениям столбца innodb (так как у меня было бы более 20 000 столбцов). Думаю, я должен переключиться на кассандру или около того. – dter

0

Попробуйте что-то вроде этого ... не тестировалось:

cnx = mysql.connector.connect(user='user', password='pw', host='ip_here') 
cursor.execute('SELECT * FROM database.`table_name`') 
iValues = cursor.fetchall() 
cursor.close 
cnx.close 

#for i,j in enumerate(iValues): 
# if i == 0: 
#  extractedValues = iValues 
# else: 
#  extractedValues = np.hstack(()) 
extractedValues = list(iValues) 
0

Вы должны попробовать это, он будет получать только те столбцы, которые вам нужны, каждый вместе в одном ряду с только один выбор:

import mysql.connector 
    import numpy as np 

    cnx = mysql.connector.connect(user='user', password='pw', host='ip_here') 

    cursor.execute('SELECT ' + ['`' + col + '`' for col in columnList].join(',') + ' FROM `table_name`') 
    values = cursor.fetchall() 

    # now values variable has the data in the columns you need 

нет необходимости for из-за списка понимания, он будет генерировать один выбор, как

SELECT `COLa`, `COLb`, `COLc` FROM `table_name`; 

, а затем выполнить его один раз и получить данные в values переменная

+0

есть ли что-то, что нужно улучшить в ответ? Почему нисходящий? – Roberto

Смежные вопросы