2015-10-15 87 views
1

我工作的这一段代码,蟒蛇2.6.6,旧版本,因为我将与执行Linux服务器上运行此脚本(可能是CentOS 6的,或Debian的)基础知识库(稳定)已安装,并且没有权限安装不在这些回购版上的软件。类型错误:“快译通”对象不支持索引

这剪断照顾到从数据库(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 always require positional arguments to be passed as a sequence, even when the query takes a single parameter. And remember that to make a single item tuple in Python you need a comma! See Passing parameters to SQL queries.

我认为我的问题是有关to this


+0

是cur_msql和cur_psql引用相同的db或不同的dbs?如果它们彼此可访问,则可以发出INSERT .. SELECT查询https://dev.mysql.com/doc/refman/5.1/en/insert-select.html – Caleth

+0

它们引用不同的数据库,源数据库是mysql,postgres中的目标数据库。这是一个将数据从一个数据库迁移到另一个数据库的脚本。两个数据库上的模式(db结构)是不同的。谢谢你的回复:) – lese

回答

1

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

虽这么说,而不必蟒蛇做参数的巨大字符串,而是考虑使用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) 
+0

谢谢你的回答,我正在分析它。我已经考虑了executemany方法,但是我放弃了它,因为它已经结束了性能的消失,因为这种方法分别执行了很多插入操作,而我尝试的方法将执行一次全部插入操作记录。 [在这里他们谈](100%更多速度)(http://stackoverflow.com/questions/8134602/psycopg2-insert-multiple-rows-with-one-query/10147451#10147451)。我的脚本将不得不处理可观的数据集 – lese

+0

谢谢,你的第一个提示修复了我的问题:) – lese

相关问题