【问题标题】:TypeError: 'dict' object does not support indexingTypeError:“dict”对象不支持索引
【发布时间】:2016-01-13 17:07:36
【问题描述】:

我正在处理这段代码,python 2.6.6,旧版本,因为我必须在安装了基本存储库(稳定)且没有权限的 linux 服务器(可能是 centOS 6 或 Debian)上执行此脚本安装不在这些存储库中的软件。

此片段注意从具有特定架构(db 结构)的数据库(mysql)中选择数据,并将其插入具有不同架构的其他数据库(postgresql)中。

cur_msql.execute("SELECT customerName, contactName, address, city, postal_code, country FROM tablename")

args_str = ','.join(cur_psql.mogrify("(%s,%s,%s,%s,%s,%s)", x) for x in cur_msql)

try:
  cur_psql.execute("INSERT INTO tablename (name, contact, address, city, cap, country) \
                    VALUES " + args_str)
except psycopg2.Error as e:
  print "Cannot execute that query", e.pgerror
  sys.exit("Leaving early the script")

我收到此错误:

TypeError: 'dict' object does not support indexing

以下帖子没有解决我的问题:

official website of psycopg2 我找到了这个,但我很难理解它的含义:

Psycopg 始终要求将位置参数作为序列传递,即使查询采用单个参数也是如此。 请记住 要在 Python 中创建单个项目元组,您需要一个逗号!看 将参数传递给 SQL 查询。

我确实认为我的问题与to this 有关:


【问题讨论】:

  • cur_msql 和 cur_psql 是引用相同的数据库还是不同的数据库?如果它们可以相互访问,您只需发出 INSERT .. SELECT 查询 dev.mysql.com/doc/refman/5.1/en/insert-select.html
  • 他们引用不同的数据库,源数据库是mysql,目标数据库在postgres。它是将数据从一个数据库迁移到另一个数据库的脚本。两个数据库上的架构(数据库结构)是不同的。谢谢你的回复:)

标签: dictionary mysql-python psycopg2 python-2.6


【解决方案1】:

cur_psql.mogrify 在你这样使用时需要位置参数,但你可以像(%(customerName)s,%(contactName)s,%(address)s,%(city)s,%(postal_code)s,%(country)s) 一样使用named parameters

话虽如此,与其让 python 生成一大串参数,不如考虑使用cur_psql.executemany

cur_psql.executemany("INSERT INTO tablename (name, contact, address, city, cap, country) VALUES (%(customerName)s,%(contactName)s,%(address)s,%(city)s,%(postal_code)s,%(country)s)", cur_msql)

【讨论】:

  • 谢谢你的回答,我正在分析。我已经考虑了executemany方法,但是我已经放弃了它,因为它过度扼杀了性能,因为这种方法单独执行了很多插入,而不是我正在尝试的方法将执行所有插入记录。 Here they talk 的速度提高了 100 倍。我的脚本将不得不处理相当大的数据集
  • 谢谢,您的第一个提示解决了我的问题:)
猜你喜欢
  • 2013-08-23
  • 2018-01-07
  • 2013-06-23
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多