【问题标题】:What is the most effective way of Inserting Python dictionaries / lists into SQL database?将 Python 字典/列表插入 SQL 数据库的最有效方法是什么?
【发布时间】:2012-08-02 04:52:53
【问题描述】:

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

【问题讨论】:

  • 如果你确实想使用关系型数据库,可以使用即将推出的具有原生 JSON 数据类型的 PostgreSQL 9.2。

标签: python sql json dictionary insert


【解决方案1】:

如果您的数据是这样的结构,它将更适合面向文档的数据库(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):

【讨论】:

  • 如果字典在第二个线程中被修改,这可能会产生错误的值顺序或过多的值。我会改用命名参数并将整个字典传递给 cursor.execute。
  • @möter 我提供了 OP 所做工作的“更正确”版本。我确实同意使用命名参数通常会更好一些。我也希望任何使用线程的人都会谨慎使用锁定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多