Я получаю данные из Интернета и вставляю их в базу данных mysql с помощью следующего кода. Кажется, проблема в моем синтаксисе SQL для добавления записей в таблицу данных. Сообщение об ошибке выглядит следующим образом:

Может ли кто-нибудь помочь с этим?

Сообщение об ошибке:

>  File "D:\Clouds\Dropbox\programming\Python\get youbike info.py", line
> 33, in <module>
>     cursor.execute(insert_data)   File "C:\Python34\lib\site-packages\mysql\connector\cursor.py", line 559,
> in execute
>     self._handle_result(self._connection.cmd_query(stmt))   File "C:\Python34\lib\site-packages\mysql\connector\connection.py", line
> 494, in cmd_query
>     result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))   File
> "C:\Python34\lib\site-packages\mysql\connector\connection.py", line
> 396, in _handle_result
>     raise errors.get_exception(packet) mysql.connector.errors.ProgrammingError: 1064 (42000): You have an
> error in your SQL syntax; check the manual that corresponds to your
> MariaDB server version for the right syntax to use near '%s, %s, %s,
> %s, %s, %s, %s, %s, %s)' at line 1

Мой код

import urllib.request
import gzip
import json
import mysql.connector
url = "http://data.taipei/youbike"
urllib.request.urlretrieve(url,"data.gz")
f=gzip.open('data.gz','r')
jdata = f.read()
f.close()
data = json.loads(jdata.decode('utf-8'))
stationNo =1
cnx=mysql.connector.connect(user='root', host='127.0.0.1', database='bike')
cursor = cnx.cursor()
for key,value in data["retVal"].items():
    sno = value["sno"]
    sna = value["sna"]
    sarea = value["sarea"]
    lat = value["lat"]
    lng = value["lng"]
    ar = value["ar"]
    sareaen = value["sareaen"]
    snaen = value["snaen"]
    aren = value["aren"]
    print("NO." + sno + " " + sna)
    stationNo+=1
    insert_data = ("INSERT INTO info "
                   "(sno, sna, sarea, lat, lng, ar, sareaen, snaen, aren) "
                   "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)")

    cursor.execute(insert_data)
    cnx.commit()
cursor.close()
cnx.close()
-1
Vincent Chen 29 Май 2017 в 07:23

2 ответа

Лучший ответ

Вы не передаете никаких данных в раздел значений, заполнитель% s становится пустым, поскольку там вы не передаете данные

insert_data = ("INSERT INTO info "
                   "(sno, sna, sarea, lat, lng, ar, sareaen, snaen, aren) "
                   "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)")

    cursor.execute(insert_data,(sno, sna, sarea, lat, lng, ar, sareaen, snaen, aren))

Попробуй это

1
Exprator 29 Май 2017 в 04:56

Чтобы помочь найти ошибку, сделайте

print "("INSERT INTO info "
       "sno, sna, sarea, lat, lng, ar, sareaen, snaen, aren) "
       "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)")

И проверьте значения для любых двойных кавычек; присутствие любого из них определенно приведет к разрыву SQL.

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

-1
Vexen Crabtree 29 Май 2017 в 04:28