想象一下,你有一个包含大量项目的键值Python字典(或列表)。假设您正在阅读更大的JSON文件,并且您希望将其内容存储到MySQL表中,其中键作为列的名称,值作为值本身。
JSON示例:
"display_location": {
"city":"Bratislava",
"state_name":"Slovakia",
"country_iso3166":"SK",
"latitude":"48.20000076",
"longitude":"17.20000076",
}
然后手动编写这样的SQL插入是非常低效的:
INSERT INTO TABLE (city, state_name, country_iso3166, latitude, longitude) VALUES('%s','%s','%s','%s','%s')
% (Bratislava, Slovakia, SK, 48.20000076, 17.20000076);
(嗯,五个值可以,但想象一下有五百个。)
是否有任何用于有效和短串SQL插入的Python类/方法?我写了这段代码:
for key,value in list.iteritems():
value_type = type(value)
if value_type is unicode:
vars_to_sql.append(value.encode('ascii', 'ignore'))
keys_to_sql.append(key.encode('ascii', 'ignore'))
else:
vars_to_sql.append(value)
keys_to_sql.append(key)
keys_to_sql = ', '.join(keys_to_sql)
之后插入看起来更简单:
INSERT INTO conditions_bratislava(%s) VALUES %r" % (keys_to_sql, tuple(vars_to_sql),)
可以有数千个值,这个插入语句你仍然可以。
请注意解码Unicode字符串的条件,因此在每个值之前不会有“u”字母。
那么,是否有更有效和准备的类或方法如何使用短INSERT字符串在同一简单方法中插入多个值?
答案 0 :(得分:6)
如果您的数据结构如此,那么它将更适合面向文档的数据库(Mongo / Couch等......)
你可以逃避这样的事情......我认为使用repr
有点过于聪明......
insert_sql = 'INSERT INTO conditions_bratislava(%s) values(%s)'
cols = ', '.join(somedict)
vals = ', '.join('?' * len(somedict)) # or whatever qparam is required
to_execute = insert_sql % (cols, vals)
some_cursor.execute(to_execute, somedict.values())
旁注:
value_type = type(value)
if value_type is unicode:
应写成:
if isinstance(value, unicode):