将Python List(JSON或其他)插入MySQL数据库

sir*_*ogo 3 python mysql json list insert

所以我在Python中有一堆数组数据.好吧,相反,我有一份清单清单.我正在尝试将此数组存储到MySQL数据库中的单个单元格中.我试图使用JSON来序列化我的数据,但也许我不明白JSON是如何工作的.

所以在连接到我的数据库之后:(我已经为上游和下游尝试了LONGTEXT和LONGBLOB数据类型

cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS 963168MBV17A(Id INT AUTO_INCREMENT PRIMARY KEY, Rev INT, Part VARCHAR(15), SN INT(7), Date DATE, Time TIME, Iterations INT(3), Upstream LONGBLOB, Downstream LONGBLOB, ResultList LONGTEXT, Result CHAR(1), Report LONGBLOB)")
Run Code Online (Sandbox Code Playgroud)

我拿了名为upstream_data和downstream_data的列表列表并执行:

export_upstream = json.dumps(upstream_data)
export_downstream = json.dumps(downstream_data)
Run Code Online (Sandbox Code Playgroud)

然后我执行SQL命令:

cur = con.cursor()    
sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES('503', '100-120970-0031', '1594539', '%s', '%s', '%s', '%s', '%s', 0, P, 0" %(export_date, export_time, export_numtests, export_upstream, export_downstream)
cur.execute(sql_input)
Run Code Online (Sandbox Code Playgroud)

引用Mordi的答案(http://stackoverflow.com/questions/4251124/inserting-json-into-mysql-using-python),我甚至尝试过:

export_upstream = json.dumps(json.dumps(upstream_data))
export_downstream = json.dumps(json.dumps(downstream_data))
Run Code Online (Sandbox Code Playgroud)

但无论我最终得到错误:

Traceback (most recent call last):
  File "P:\Projects\testing database\scrap\test.py", line 83, in <module>
    cur.execute(sql_input)
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
ProgrammingError: (1064, "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 '' at line 1")
Run Code Online (Sandbox Code Playgroud)

而且,当我做一个

print "about to execute(%s)" % sql_input
Run Code Online (Sandbox Code Playgroud)

我看到JSON对象显示为一个长字符串,其中包含大量单引号(对于列表,在外部表示字符串).当我执行json.dumps(json.dumps(upstream_data))时,内部引号变为双引号""并以\ _字符开头.尽管如此,我仍然得到同样的错误.

有任何想法吗?如果没有,有什么更好的方法将Python数组/列表数据存储到单个MySQL单元中?

在这里输出

Mar*_*ers 6

你需要让MySQL库为你做参数处理; 这有一个额外的好处,让MySQL准备你的语句,也可以更快地重复插入:

cur = con.cursor()    
sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES('503', '100-120970-0031', '1594539', ?, ?, ?, ?, ?, 0, P, 0"
cur.execute(sql_input, (export_date, export_time, export_numtests, export_upstream, export_downstream))
Run Code Online (Sandbox Code Playgroud)

有关参数化SQL的(某些)更多详细信息,请参阅Python DB API 2.0规范.每个数据库适配器都记录了完全支持的参数格式,因此也请检查.例如,MySQLdb模块模仿python字符串格式化语法,并%s用作占位符:

sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES('503', '100-120970-0031', '1594539', %s, %s, %s, %s, %s, 0, P, 0"
Run Code Online (Sandbox Code Playgroud)

其他可能的参数选项是数字(:1, :2等),名称(:foo, :bar)或其他形式的python字符串格式,命名格式说明符:( %(foo)s, %(bar)s).