相关文章推荐
不拘小节的紫菜  ·  python ...·  8 小时前    · 
细心的泡面  ·  python ...·  6 小时前    · 
有爱心的显示器  ·  mongo ...·  10 月前    · 
会开车的匕首  ·  oracle instr函数(oracle ...·  1 年前    · 
豪情万千的葡萄酒  ·  React Three.js ...·  1 年前    · 

如何通过python将python字典存储到mysql数据库中?

14 人关注

我试图通过将字典转换为字符串,然后尝试插入,将下面的字典存储到mysql DB中,但我得到了以下错误。如何解决这个问题,或者是否有任何其他方法将字典存储到mysql数据库?

dic = {'office': {'component_office': ['Word2010SP0', 'PowerPoint2010SP0']}}
d = str(dic)
# Sql query
sql = "INSERT INTO ep_soft(ip_address, soft_data) VALUES ('%s', '%s')" % ("192.xxx.xx.xx", d )
soft_data is a VARCHAR(500)
    执行异常(1064,"你的SQL语法有错误;请查看与你的MySQL服务器版本相对应的手册,了解正确的语法。
使用附近的'office'。{'component_office':['Word2010SP0', 'PowerPoint2010SP0' 在第1行")

有什么建议或帮助吗?

python
mysql
dictionary
Vb407
Vb407
发布于 2013-10-31
5 个回答
vartec
vartec
发布于 2020-03-26
已采纳
0 人赞同

首先,永远不要像这样构建原始的SQL查询。永远不要。这就是参数化查询的作用。你所要求的是一个 SQL injection 攻击。

如果你想存储任意的数据,比如说Python字典,你应该将这些数据序列化。 JSON 将是该格式的良好选择。

总的来说,你的代码应该是这样的。

import MySQLdb
import json
db = MySQLdb.connect(...)    
cursor = db.cursor() 
dic = {'office': {'component_office': ['Word2010SP0', 'PowerPoint2010SP0']}}
sql = "INSERT INTO ep_soft(ip_address, soft_data) VALUES (%s, %s)"
cursor.execute(sql, ("192.xxx.xx.xx", json.dumps(dic)))
cursor.commit()
    
如何在服务器另一端对数据进行反序列化?
@VignanBandi: dic = json.loads(str_from_db)
Ali SAID OMAR
Ali SAID OMAR
发布于 2020-03-26
0 人赞同

修改你的代码如下。

dic = {'office': {'component_office': ['Word2010SP0', 'PowerPoint2010SP0']}}
d = str(dic)
# Sql query
sql = """INSERT INTO ep_soft(ip_address, soft_data) VALUES (%r, %r)""" % ("192.xxx.xx.xx", d )   
    
它仍然抛出同样的错误(1064,'你的SQL语法有错误;查看与你的MySQL服务器版本相对应的手册,了解在'192.xxx.xxx'/'附近使用的正确语法,'"{'component_office/''在第1行。['Word2010SP0']}"/"{'component_office': [Word2010SP0']}"在第1行')
OK,把d = str(dict)改为d = json.dumps(dic)。
谢谢你的意见,MySQLdb.escape_string()解决了这个问题。
Kobi K
Kobi K
发布于 2020-03-26
0 人赞同

Try this:

dic = { 'office': {'component_office': ['Word2010SP0', 'PowerPoint2010SP0'] } }
"INSERT INTO `db`.`table`(`ip_address`, `soft_data`) VALUES (`{}`, `{}`)".format("192.xxx.xx.xx", str(dic))

dbtable改为你需要的数值。

by doing this im getting following exception (1054, "Unknown column '192.xx.xx.xxx' in 'field list'")
Change d in the INSERT to dic
我试了一下脚本,它工作正常,你能打印你的代码和回溯吗? 很难理解错误在哪里,还有一个选择,只在mysql工作分支尝试SQL语句。
谢谢你的意见,MySQLdb.escape_string()解决了这个问题。
如果有人不是在2013年读到这篇文章的话。这个错误是由于大括号周围的反面符号造成的。它们应该是单引号。
mbunch
mbunch
发布于 2020-03-26
0 人赞同

对你的输入进行消毒是一个好主意,当需要在一个查询中多次使用同一个变量时,'.format'很有用。(在这个例子中你不需要这样做)

dic = {'office': {'component_office': ['Word2010SP0', 'PowerPoint2010SP0']}}
ip = '192.xxx.xx.xx'
with conn.cursor() as cur:
  cur.execute("INSERT INTO `ep_soft`(`ip_address`, `soft_data`) VALUES ({0}, '{1}')".format(cur.escape(ip),json.dumps(event)))
  conn.commit()

如果你不使用cur.escape(variable),你将需要用引号把占位符{}括起来。

John Drinane
John Drinane
发布于 2020-03-26
0 人赞同

这个答案有一些关于连接对象的伪代码,而且mysql的味道是memsql,但除此之外,它应该是直接遵循的。

import json
#... do something
a_big_dict = getAHugeDict()  #build a huge python dict
conn = getMeAConnection(...)
serialized_dict = json.dumps(a_big_dict) #serialize dict to string
#Something like this to hold the serialization...
qry_create = """
CREATE TABLE TABLE_OF_BIG_DICTS (
ROWID BIGINT NOT NULL AUTO_INCREMENT,
SERIALIZED_DICT BLOB NOT NULL,
UPLOAD_DT TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
KEY (`ROWID`) USING CLUSTERED COLUMNSTORE
conn.execute(qry_create)
#Something like this to hold em'
qry_insert = """
INSERT INTO TABLE_OF_BIG_DICTS (SERIALIZED_DICT)
SELECT '{SERIALIZED_DICT}' as SERIALIZED_DICT;
#Send it to db
conn.execute(qry_insert.format(SERIALIZED_DICT=serialized_dict))
#grab the latest
qry_read = """
SELECT a.SERIALIZED_DICT
from TABLE_OF_BIG_DICTS a
    SELECT MAX(UPLOAD_DT) AS MAX_UPLOAD_DT
    FROM TABLE_OF_BIG_DICTS
)                           b
ON  a.UPLOAD_DT = b.MAX_UPLOAD_DT
LIMIT 1
#something like this to read the latest dict...
df_dict = conn.sql_to_dataframe(qry_read)