2017-05-29 15 views
-1

Webからデータを取得して、次のコードでmysqlデータベースに挿入しています。データテーブルにレコードを追加するためのSQL構文に問題があるようです。エラーメッセージは次のようになります。mysql.connectorを使ってPython 3.4でmysqlにデータを挿入する際の構文エラー

誰かがこれを手助けできますか?

エラーメッセージ:

> 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

が、それはすべきではないしてみてください(insert_data、sno、sna、sarea、...) '? – kuro

答えて

1
あなたが値セクションに任意のデータを渡していない

、プレースホルダ%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)) 

`cursor.executeこの

+0

ありがとう!あなたの助言はうまくいきます。 –

+0

あなたは歓迎です@VincentChen – Exprator

-1

、フォールト見つける

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

を行い、任意の二重引用符の値をチェックします。 anyが存在すると、確実にSQLが中断されます。

また、「ウェブからデータを取得して」コードにそのまま挿入することで、非常に深刻なSQL挿入攻撃がアプリを開くようになるので、おそらく、 Web入力、引用符の削除に加えて

関連する問題