Python MySQL插入unicode
我正在尝试将JSON数据插入MySQL数据库:Python MySQL插入unicode,mysql,python-2.7,unicode,Mysql,Python 2.7,Unicode,我正在尝试将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.
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语句就可以工作了。有些变量是元组,有些是字符串。非常感谢您的帮助。您插入的是元组,而不是字符串;删除后面的逗号:
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参数是中和攻击向量的最好方法。p> 对于您发布的错误消息,您忘记了在SQL查询中将右括号放在值之前。查询应类似于:
cur.execute("INSERT INTO devices(apID,mac,type,manuf,last_seen) VALUES(1,'" + str(sqlMac) + "','" + str(sqlType) + "','" + str(sqlManuf) + "','" + str(sqlTime) + "');")
对于具有
(u'value')
的列,请使用变量[0]
。像用str(sqlMac[0])
替换str(sqlMac[0])
@AbdullahRazzaki谢谢你,这让它工作起来了!除非你把它作为答案贴出来,否则我无法关闭它:)如果你这样做,我会关闭它。很好的想法,再次感谢:)不客气,但我的方法是不正确的,因为我忽略了逗号,并认为你从函数中得到了元组使用@Martjin的方法。这是正确的way@AbdullahRazzaki非常感谢。我现在正在用新的眼光和咖啡来看待这一点:)这并没有解决引用的真正问题。是的,但是错误信息一定是随着编辑和更正括号而改变的!:-)但不是在OP.@shahsani上发布的,谢谢你。我在评论中说sql是不正确的,因为我整天都在切碎代码,不小心在那里复制了一些旧代码!Martjin感谢您的回复,这是一个非常好的回答,有很多细节。如果我删除后面的逗号(sqlMac=c['kismet.device.base.macaddr']),那么我将得到一个TypeError,因为您无法迭代'int'对象。SQl参数-很公平,我使用的是PyMySql。我会调查的。现在,我是按照@AbdullahRazzaki在我问题下面的评论中的建议来做的。@JamesPy PyMySQL使用了%s
占位符,是的。@JamesPy我想你是因为ktime
现在是一个int,所以你也可以删除For循环,它应该可以工作。删除逗号,我没有注意到逗号@马津氏right@AbdullahRazzaki啊哈!这就是迭代尝试的地方。@JamesPy使用最新的更新,迭代问题也应该得到解决。很抱歉,我现在的注意力有点分散,我应该早点发现的。