我正在尝试将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语句工作。有些变量是元组,有些是字符串。非常感谢您的帮助。
2条答案
按热度按时间yeotifhr1#
你在插入元组,而不是字符串;删除后面的逗号:
后面的逗号将这些表达式转换为元组
str()
在元组上,将容器unicode字符串作为u'....'
然后与'
引用您正在添加的内容。注意,这样就不需要循环了
ktime
!接下来,您确实希望使用sql参数,而不是字符串串联。使用占位符而不是
'" + str(...) + "'
,并将引用的处理留给数据库适配器:这个
%s
是占位符;根据具体的mysql python库,您可能需要使用?
而是问号。这不仅让你避免了思考引用,而且也消除了严重的安全问题:JSON你加载可以包含SQL注入攻击,SQL参数是中和攻击向量的最好方法。
mlmc2os52#
对于您发布的错误消息,您忘记在
VALUES
在sql查询中。查询应类似于: