Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MySQL插入unicode_Mysql_Python 2.7_Unicode - Fatal编程技术网

Python MySQL插入unicode

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.

我正在尝试将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语句就可以工作了。有些变量是元组,有些是字符串。非常感谢您的帮助。

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

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使用最新的更新,迭代问题也应该得到解决。很抱歉,我现在的注意力有点分散,我应该早点发现的。