2016-10-05 5 views
0

Я новичок в mySQL с Python, и я получаю общую ошибку 1054 при попытке выполнить подготовленную инструкцию SQL INSERT с дружественными Python заполнителями ('% s')Ошибка SQL 1055 «Неизвестный столбец« xxxxx »в« списке полей »в Python с заполнителями

Я понимаю, что нормальное решение состоит в том, чтобы добавлять кавычки вместо обратных тиков или добавлять их, если они отсутствуют для вставленных значений, однако я проверил проверку cols и vals кортежи, и я вижу, что они содержатся в одинарных кавычках, поэтому я немного озадачен, почему возникает эта ошибка.

Ниже приведен фрагмент моего кода: (BTW «смещ_по_столбцам» и «» Vals являются кортежи строк (с акцентом на строках :))

Сначала я добавить имена столбцов:

for item in cols: 
    try: 
     # First add columns if not already present 
     query = "ALTER TABLE Parameters ADD COLUMN %s VARCHAR(200)" % (str(item)) 

     cursor.execute(query) 
     connection.commit() 
    except: 
     pass 

Тогда я стараюсь добавляющие ценности:

sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols))); 
    try: 
     cursor.execute(sql, vals) 

    except Exception as e: 
     print(e) 

    connection.close() 

Иногда нет никаких проблем, но в противном случае я получаю эту ошибку:

(1054, "Unknown column 'ColumnName' in 'field list'") 

Является ли моя инструкция Python совершенно неправильной, и не являются ли места не лучшей практикой? Я использую заполнители, так как мои списки очень большие.

Ниже приведена опечатанная версия инструкции SQL-запроса.

INSERT INTO Parameters (TestID, Dev_Type, Version, MAC, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DayActNxtDateTime, XXXX) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) 

И ошибка:

(1054, "Unknown column 'DayActNxtDateTime' in 'field list'") 
+0

Распечатайте инструкцию SQL после выполнения замены переменных. Если ответ не очевиден, поместите результат в вопрос. –

+0

Вы не можете использовать заполнители для имен полей. –

+0

Привет @Gordon Linoff, я не могу пропустить это утверждение, поскольку это конфиденциальные данные, но я уже проверил это. Я приложу пример, который я приведу после печати. – MikG

ответ

0

Кажется, вы спрашиваете, как неприятности снимать этот вопрос?

INSERT INTO Parameters ({0}) VALUES ({1}) 

ошибка сообщает, что в вашем ({0}), то есть одно поле под названием «ColumnName», но он не определен в таблице параметров.

Try:

SHOW CREATE TABLE parameters; 

И убедитесь, что таблица содержит поле.

Если все еще есть проблемы, затем распечатать все SQL в обработчике исключений:

print(e) 
print(sql) 

Тогда я побегу ТСРйитр, чтобы убедиться, что SQL строка не наломать неправильно по любой библиотеке

sudo tcpdump -A -i lo0 dst port 3306 

А затем запустите свой скрипт.

0

Спасибо @Gordon Linoff и @Shuo за вашу помощь. Оказалось, что моя тупиковая версия SQL-запроса вводит в заблуждение. Я играл с ручным добавлением столбцов напрямую с помощью командной строки SQL, чтобы найти ответ.

Оказалось, что некоторые из моих имен столбцов превысили ограничение на 64 символа, введенное SQL (эти имена столбцов генерируются программно), поэтому почему-то цикл иногда работал, а в других случаях это не так. Не уверен, есть ли способ в SQL сократить заголовок столбца, я увидел что-то о методе COMPRESS после быстрого взгляда?

В то же время я создал словарь Python для захвата этих дополнительных длинних имен столбцов при создании и сопоставил их с созданным вручную альтернативным значением, на данный момент это будет сделано. Еще раз спасибо за то, что дал мне направление.