Невозможно вставить в MySQL через Python и pymysql

У меня есть таблица с 9 столбцами, первые три — текст, а последние 6 — INT.

Когда я вставляю в текстовые поля, все работает как положено

conn = pymysql.connect(host='', port=, user='', passwd='', db='')
cur = conn.cursor()
cur.execute("INSERT INTO table(Name) VALUES ('Sample Name')")

Этот код работает нормально и позволяет мне вставить имя в мою базу данных. Однако при выполнении оператора вставки для моего целочисленного материала у меня возникают всевозможные проблемы.

Я пробовал все следующее:

cur.execute("INSERT INTO table(Left Avg) VALUES (5)")
cur.execute("INSERT INTO table(Left Avg) VALUES (%s)", (5))
cur.execute("INSERT INTO table(Left Avg) VALUES (%s)" % (5))
cur.execute("""INSERT INTO mlb_data(Left Avg) VALUES (%s)""" % (5))

По сути, независимо от того, что я пытаюсь вставить свое целое число в таблицу, я получаю следующую ошибку.

Traceback (most recent call last):
File "testing.py", line 12, in <module>
cur.execute("""INSERT INTO mlb_data(Left Avg) VALUES (%s)""" % (5))
File "build/bdist.macosx-10.7-intel/egg/pymysql/cursors.py", line 117, in execute
File "build/bdist.macosx-10.7-intel/egg/pymysql/connections.py", line 189, in     defaulterrorhandler
pymysql.err.ProgrammingError: (1064, u"You have an error in your SQL syntax; check the    manual that corresponds to your MySQL server version for the right syntax to use near 'Left   Avg) VALUES (5)' at line 1")

Я попытался изменить планшет MySQl на VarChar, а не на INT, но каждый раз, когда я пытаюсь вставить число, я получаю сообщение об ошибке.

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ: я не знаю, не пробовал ли я это раньше или мое форматирование было неправильным, но я понял это.

num = 5.23947824987
cur.execute("INSERT INTO mlb_data(LeftAvg) VALUES (%s)", (num,))

Работает без сбоев. Так ли это, или мне просто очень повезло?


person Peter Foti    schedule 24.04.2013    source источник


Ответы (3)


как насчет

cur.execute("INSERT INTO table(`Left Avg`) VALUES (?)", (5,))

предполагая, что «Left Avg» - это имя столбца, вам, вероятно, следует стараться избегать пробелов в именах столбцов, как общее правило.

person Joran Beasley    schedule 24.04.2013
comment
Итак, я попробовал это (кстати, спасибо за ответ) и изменил имя столбца на LeftAvg (удалив пробел), но теперь я получаю следующую ошибку. File "testing.py", line 11, in <module> cur.execute("INSERT INTO mlb_data('LeftAvg') VALUES (?)", (5,)) File "build/bdist.macosx-10.7-intel/egg/pymysql/cursors.py", line 105, in execute TypeError: not all arguments converted during string formatting - person Peter Foti; 24.04.2013
comment
Попробуйте удалить ' вокруг имени столбца. В MySQL управляющий символ равен ` - person aweis; 24.04.2013
comment
почему (5,) ? разве это не должно быть просто (5) ? - person lxx; 18.01.2015
comment
просто для ясности... это делает более понятным, что кортеж передается в - person Joran Beasley; 18.01.2015

в ответ на ваш последний вопрос: вам просто повезло, и/или вы поняли или вспомнили Pythonic способ создания SQL-запросов. вы можете увидеть похожие примеры в site-packages/pymysql/tests/test_basic.py, например:

            v = (True, -3, 123456789012, 5.7, "hello'\" world", u"Espa\xc3\xb1ol
", "binary\x00data".encode(conn.charset), datetime.date(1988,2,2), datetime.date
time(2014, 5, 15, 7, 45, 57), datetime.timedelta(5,6), datetime.time(16,32), tim
e.localtime())
            c.execute("insert into test_datatypes (b,i,l,f,s,u,bb,d,dt,td,t,st) 
values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", v)
person jcomeau_ictx    schedule 03.12.2016

Самый простой способ INSERT в Python — использовать конкатенацию строк. Что-то вроде этого:

id_user = 1
username = "Tudor"
address = "Cluj-Napoca"
sql = "INSERT INTO user(id_user,username,address) VALUES (" + id_user + ",'" + username + "','" + address + "');"
cursor.execute(sql)

Но большое внимание к символам " и ". Я настоятельно рекомендую распечатать перед выполнением запроса.

person Tudor Popa    schedule 26.04.2016
comment
Это плохая практика, так как она открывает доступ к инъекциям SQL. - person Andy Chase; 26.06.2016