所以,我有一大堆的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)")
我把我的表称为upstream_data和downstream_data做的名单:
export_upstream = json.dumps(upstream_data)
export_downstream = json.dumps(downstream_data)
然后我执行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)
参照由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))
但不管我最终的错误:
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")
此外,当我做了
print "about to execute(%s)" % sql_input
我看到JSON对象表现为一个长字符串,有很多单引号的所有的地方(的名单,并在外面代表字符串)。 当我做了json.dumps(json.dumps(upstream_data)),内部报价成为双引号“”和\字符之前。 不过,虽然,我得到了同样的错误。
有任何想法吗? 如果没有,没有更好的方式来存储阵列的Python /列表数据到一个单一的MySQL的细胞?
输出这里
Answer 1:
你只是呼吁在incrorrect形式DB API,如果您替换您的参数,这样,你就会对自己负责转义引号和双引号中的数据。
这不仅可以给你tehe错误你有(和幸运的,你为),因为这也使得SQL注入的危险的攻击。
Python的API,以数据库是从地上爬起来,以避免此类攻击的可能性desigened,它通过让调用做到这一点symply cursor.execute
为你做的字符串替换。 然后,它会添加必要逃逸到您的字符串。 所以,与其这样做:
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)
做
sql_input = "INSERT INTO 963168MBV17A(Rev, Part, SN, Iterations, Date, Time, Upstream, Downstream, ResultList, Result, Report) VALUES(%s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s"
cur.execute(sql_input, [503, '100-120970-0031', '1594539', export_date, export_time, export_numtests, export_upstream, export_downstream, 0, "P", 0] )
--Still,如果您需要在自动生成的文件在源文件中的所有那些疯狂的硬编码的数字,而不是,我敢说你的计划注定反正失败。
Answer 2:
你需要让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))
见Python的DB API 2.0规范对参数化的SQL(一些)的更多细节。 确切的支持参数格式每个数据库适配器记载,因此检查过。 的MySQLdb的模块,例如,模仿蟒字符串格式化语法,并且使用%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"
其他可能的参数选项是数字( :1, :2
等),名称( :foo, :bar
)或Python字符串格式的其他形式,命名格式说明:( %(foo)s, %(bar)s
)。
Answer 3:
我与你的代码中看到的第一个问题是这样的:
sql_input = "INSERT INTO table (column) VALUES('%s');" % ( data )
你永远不应该这样做 - 你使用字符串插值,它不保护您免受SQL注入攻击或恶意SQL。
大多数蟒DB API使用的占位符语法类似于此:
sql = "INSERT INTO table (column) VALUES( %s );"
values = (data,)
cur.execute(sql,values)
请注意,您在声明和值传递分开。 该API处理逃逸和格式。
一些将允许类型的字典以及:
sql = "INSERT INTO table (column) VALUES( %(id)s );"
values = { 'id': 1 )
cur.execute(sql,values)
阅读上如何正确使用你的数据库API - 这是你最大的问题,并可能导致您的所有其他问题。
Answer 4:
有一两件事你可以尝试是使用SQLAlchemy的SQL表达式生成将处理所有的转义和这样的你,加上可以让你避免很多安全漏洞处理(至少在插入SQL数据库和这样的条款)。 它参数化查询,而不是在做联字符串插值像你正在尝试做的。
Answer 5:
我希望这个问题是由于逃避SQL命令,或者说缺乏相同。
永远,永远,永远做到这一点;
cursor.execute("INSERT INTO whatever VALUES (%s)" % "foo")
除了你看到的问题,如果你通过用户输入有(查找“小约翰尼表”,如果你不知道为什么),它是不安全的。
相反,这样做:
cursor.execute("INSERT INTO whatever VALUES (%s)", ["foo"])
而让MySQL的接口理清逃逸。
文章来源: Insert Python List (JSON or otherwise) into MySQL databse