TypeError: объект dict не поддерживает индексирование
Я работаю над этим фрагментом кода, python 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
следующие посты не исправили мою проблему:
- Psycopg2 с использованием подстановочных знаков вызывает TypeError
- http://markmail.org/message/m2mmbqgq2emfqwex
На официальном сайте psycopg2 я нашел это, но у меня плохие времена, когда я понимаю, что это значит:
Psycopg всегда требует, чтобы позиционные аргументы передавались как последовательность, даже когда запрос принимает один параметр. И помните, что для создания одного кортежа в Python вам нужна запятая! См. Передача параметров в запросы SQL.
Я думаю, что моя проблема связана с этим:
1 ответ
cur_psql.mogrify нуждается в позиционных параметрах, когда вы используете его таким образом, но вы можете использовать именованные параметры, такие как (%(customerName)s,%(contactName)s,%(address)s,%(city)s,%(postal_code)s,%(country)s)
С учетом вышесказанного, вместо того, чтобы 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)