Ошибка типа при попытке вставить значения dict в таблицу postgresql

У меня возникли проблемы с вставкой нескольких значений в таблицу postgres с помощью функции python psycopg2 executemany(). У меня есть dict со следующими значениями:

{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'

Так почему же я не могу правильно вставить эти значения? Спасибо за помощь!


person sreisman    schedule 27.02.2014    source источник
comment
попробуйте: cur.executemany(..., [dict]). executemany ожидает список списков или словарей.   -  person isedev    schedule 27.02.2014


Ответы (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'] таким образом.

person Martijn Pieters    schedule 27.02.2014