尝试将字典值插入PostgreSQL表时发生类型错误

2 投票
1 回答
1415 浏览
提问于 2025-04-17 20:20

我在用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: string indices must be integers

我意识到我可能在用一个字符串去引用另一个字符串,但我不太确定是哪里出了问题。如果我这样做:

dict['state']

我能得到正确的输出:

u'17'

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

1 个回答

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'] 这样的事情。

撰写回答