python mysql插入unicode

mbzjlibv  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(425)

我正在尝试将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")

我可以从错误中看出,各种值的后缀都是“u”。我通过大量的搜索和学习了解到(我认为)这意味着数据是unicode的。
我想做的是找到一种转换/解码数据的方法,以便insert语句工作。有些变量是元组,有些是字符串。非常感谢您的帮助。

yeotifhr

yeotifhr1#

你在插入元组,而不是字符串;删除后面的逗号:

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参数是中和攻击向量的最好方法。

mlmc2os5

mlmc2os52#

对于您发布的错误消息,您忘记在 VALUES 在sql查询中。查询应类似于:

cur.execute("INSERT INTO devices(apID,mac,type,manuf,last_seen) VALUES(1,'" + str(sqlMac) + "','" + str(sqlType) + "','" + str(sqlManuf) + "','" + str(sqlTime) + "');")

相关问题