2012-08-04 457 views
10

想象一下,您有一个包含大量项目的键值Python字典(或列表)。假设您正在阅读更大的JSON文件,并且您希望将其内容存储到MySQL表中,并将键作为列的名称和值作为值本身。将Python字典/列表插入到SQL数据库中最有效的方法是什么?

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),) 

可以有成千上万的值,你仍然会被罚款与这一个INSERT语句。

请注意,将解码Unicode字符串的条件,所以你不会有每个值之前的“u”字母。

那么,有没有更有效的和准备好的类或方法如何插入许多值与简单的方法与短INSERT字符串?

+1

如果您确实想要使用关系数据库,可以使用即将推出的具有本机JSON数据类型的PostgreSQL 9.2。 – 2012-08-04 12:01:44

回答

6

如果您的数据结构那样,那就更借本身对文档导向的数据库(蒙戈/沙发等...)

你可以逃脱这样的事情...我认为使用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): 
+0

'isinstance'上的+1 – 2012-08-04 12:46:38

+0

如果字典在第二个线程中被修改,则这可能会产生不正确的值顺序或太多的值。我会使用命名参数,并将整个字典传递给cursor.execute。 – XORcist 2012-08-04 14:14:49

+0

@möter我提供了OP正在做的“更正确”的版本。我同意使用命名参数在一般情况下会稍微好一些。我也希望任何使用线程的人都会警惕使用锁定。 – 2012-08-04 14:39:00

相关问题