Синтаксическая ошибка SQL при попытке вставить в python - PullRequest
0 голосов
/ 26 января 2020

В моей базе данных есть следующая таблица:

create table tt (
id varchar(20),
hora varchar(20),
preco varchar(20),
qtde varchar(20),
cpa varchar(20),
vda varchar(20),
agressor varchar(20)
);

Я поместил их все как varchar (30), потому что моя голова была слишком белой от ошибок, которые они совершали.

даже со всеми полями, такими как varchar (30), я не могу вставить следующие 7 значений через python

19928 12:53:34 4.049,00 5 107 308 Comprador

(19928, "У вас ошибка в синтаксисе SQL; обратитесь к руководству что соответствует вашей MySQL версии сервера для правильного синтаксиса для использования рядом с ': 53: 34, 4.049,00, 5, 107, 308, Comprador)' в строке 1 ")

моя команда для вставки в это следующее:

c.execute("INSERT INTO tt VALUES ({}, {}, {}, {}, {}, {}, {})".format(id_, hora, preco, qtde, cpa, vda, agressor))
conn.commit()

может также помочь мне в том, какие типы переменных использовать для создания таблицы? (int, varchar (20), float)?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Вы должны использовать подготовленный оператор здесь, который, вероятно, также разрешит ваши текущие ошибки:

cursor = conn.cursor(prepared=True)
sql = """INSERT INTO tt (id, hora, preco, qtde, cpa, vda, agressor)
         VALUES (%s, %s, %s, %s, %s, %s, %s)"""
cursor.execute(sql, (id_, hora, preco, qtde, cpa, vda, agressor,))
conn.commit()

Используя этот подход, вы позволяете Python / MySQL беспокоиться о том, как правильно экранировать ваши строковые данные с помощью одинарные кавычки. Также обратите внимание, что рекомендуется всегда явно перечислять целевые столбцы для вставки, что я сделал выше.

0 голосов
/ 26 января 2020

Ваша проблема в том, что ваш запрос выглядит следующим образом:

INSERT INTO tt VALUES (19928, 12:53:34, 4.049,00, 5, 107, 308, Comprador)

, что недопустимо из-за нецитированных значений времени и строки и запятой в одном из чисел. Вам необходимо использовать подготовленную форму выписки:

c = conn.cursor()
c.execute("INSERT INTO tt VALUES (%s, %s, %s, %s, %s, %s, %s)",(id_, hora, preco, qtde, cpa, vda, agressor))
conn.commit()
c.close()

Обратите внимание, что при изменении типов данных столбца для вставки 4.049,00 в MySQL в качестве числа вам необходимо сначала поменять , и . символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...