Python MySQL INSERT Юникод - PullRequest
       1

Python MySQL INSERT Юникод

0 голосов
/ 20 октября 2018

Я пытаюсь вставить данные JSON в базу данных MySQL:

def mapClients():
    for d in devices:
        clientMap =  d['dot11.device']['dot11.device.associated_client_map'].keys()
        for item in clientMap:
            clientList = kr.device_by_mac(item)
            times = kr.device_summary_since()
            for c in clientList:
                sqlMac =  c['kismet.device.base.macaddr'],
                sqlType = c['kismet.device.base.type'],
                sqlManuf = c['kismet.device.base.manuf'],
                ktime = c['kismet.device.base.last_time'],
                for t in ktime:
                    sqlTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t)) 
                    cur.execute("INSERT INTO devices(apID,mac,type,manuf,last_seen) VALUES(1,'" + str(sqlMac) + "','" + str(sqlType) + "','" + str(sqlManuf) + "','" + sqlTime + "');")
                    conn.commit()

mapClients()

Это возвращает следующую ошибку:

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 'VALUES(1,'(u'58:E2:8F:CF:20:B3',)','(u'Wi-Fi Client',)','(u'Apple',)','20-10-201' at line 1")

Я вижу из ошибки, что различные значенияв суффиксе с «и».После многих поисков и исследований я понимаю, что (я думаю) это означает, что данные являются Unicode.

Что я хочу сделать, так это найти способ преобразования / декодирования данных, чтобы операторы INSERT работали.Некоторые из переменных являются кортежами, некоторые строки.Любая помощь высоко ценится.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Для отправленного вами сообщения об ошибке вы забыли поместить закрывающие скобки перед VALUES в запросе SQL.Запрос должен быть таким:

cur.execute("INSERT INTO devices(apID,mac,type,manuf,last_seen) VALUES(1,'" + str(sqlMac) + "','" + str(sqlType) + "','" + str(sqlManuf) + "','" + str(sqlTime) + "');")
0 голосов
/ 20 октября 2018

Вы вставляете кортежи , а не строки;удалите запятые:

sqlMac =  c['kismet.device.base.macaddr']
sqlType = c['kismet.device.base.type']
sqlManuf = c['kismet.device.base.manuf']
ktime = c['kismet.device.base.last_time']
sqlTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(ktime))

Это запятая, которая превращает эти выражения в кортежи, а str() в кортеже дает вам строку Unicode контейнера как представление u'....', которое затем конфликтует с ' цитата, которую вы добавляете.

Обратите внимание, что устраняется необходимость в цикле по ktime!

Далее, вы действительно хотите использовать параметры SQL , а не конкатенацию строк.Используйте заполнители вместо '" + str(...) + "' и оставьте обработку цитирования для адаптера базы данных:

cur.execute("""
    INSERT INTO devices (apID, mac, type, manuf, last_seen)
    VALUES (1, %s, %s, %s, %s)
""", (sqlMac, sqlType, sqlManuf, sqlTime))

%s - это заполнители;в зависимости от вашей конкретной библиотеки MySQL Python, вам может потребоваться вместо этого использовать ? вопросительные знаки.

Это не только позволит вам не думать о заключении в кавычки, но и устранит серьезную проблему безопасности: загружаемый вами JSON может содержать атаку SQL-инъекции, а параметры SQL - лучший способнейтрализовать этот вектор атаки.

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