尝试将dict值插入postgresql表时键入错误

时间:2014-02-27 18:53:56

标签: python dictionary psycopg2

我无法使用python的psycopg2 executemany()函数将多个值插入到postgres表中。我有一个带有以下值的字典:

{u'city': u'14000', u'sitename': u'12298', u'longitude': u'-9767764.18643674', u'county': u'17031', u'sourceid': u'42', u'state': u'17', u'latitude': u'5147311.10876352', u'csrfmiddlewaretoken': u'WY7EBHl55TuWSwXv4C3vNa5X5d0peJyv', u'sourcesiteid': u'42'  }

我试图使用以下代码插入:

try:
    con = psycopg2.connect(db_connect)
    cur = con.cursor()

    cur.executemany("""INSERT INTO cacw_sites(sourceid,sitename,sourcesiteid,state,county,city,schooldistrict,zipcode,neighborhood,latitude,longitude) 
                       VALUES ( %(sourceid)s, %(sitename)s, %(sourcesiteid)s, %(state)s, %(county)s, %(city)s, %(zipcode)s, %(neighborhood)s, 
                                %(latitude)s, %(longitude)s)""", dict)
    con.commit()
except psycopg2.DatabaseError, e:
    print 'There was a problem updating the sites: %s'%e

finally:
    if con:
        con.close()

但是,我一直收到错误: TypeError:字符串索引必须是整数

我意识到我在某种程度上试图用另一个字符串引用一个字符串,但我不知道在哪里。如果我做

dict['state']

我收到

的正确输出
u'17'

那么为什么我似乎无法正确插入这些值? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您正在使用需要序列字典的executemany(),但只给它一个词典。

使用:

cur.execute(
    """INSERT INTO cacw_sites(sourceid,sitename,sourcesiteid,state,county,city,schooldistrict,zipcode,neighborhood,latitude,longitude) 
       VALUES ( %(sourceid)s, %(sitename)s, %(sourcesiteid)s, %(state)s, %(county)s, %(city)s, %(zipcode)s, %(neighborhood)s, 
                %(latitude)s, %(longitude)s)""", dict)

代替。

相反,数据库适配器在字典对象上循环,产生键(每个字符串),然后尝试在这些字符串上查找参数。你最终试图以这种方式做同等的'sourceid'['sourceid']