10

想象一下,您有一个包含大量项目的键值 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 字符串以相同的简单方法插入许多值?

4

1 回答 1

5

如果您的数据是这样的结构,它将更适合面向文档的数据库(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):
于 2012-08-04T10:43:23.253 回答