Ошибка при попытке вставить список словарей с pyodbc и python в базу данных, размещенную в Azure

#python #azure #pyodbc

#python #azure #pyodbc

Вопрос:

Я пытаюсь вставить список словарей с помощью pyodbc и python, но я получаю следующую ошибку:

 TypeError: ('Params must be in a list, tuple, or Row', 'HY000')
 

У меня есть база данных, размещенная в Azure, и мне нужно вставить более 1800 строк в таблицу, подобную следующему примеру

 kp = {'documents': [
{'id': '1', 'keyPhrases': ['sport', 'baseball', 'aliens']},
{'id': '2', 'keyPhrases': ['play', 'capacity', 'tired']},
{'id': '3', 'keyPhrases': ['international', 'balance', 'boring']}
]

lst = []
for x in kp['documents']:
    for i in kp['keyPhrases']:
        lst.append({'keyphrases': i, 'paragraph_id': x['id']})
cursor.fast_executemany = True
sql = 'INSERT INTO keyphrases2 (keyphrases, paragraph_id) VALUES (% 
(keyphrases)s, %(paragraph_id)s'
cursor.executemany(sql, lst)
 

Комментарии:

1. Ваш опубликованный код не достигает первого append из-за синтаксической ошибки и ошибки ссылки. Код не является минимальным: код через вложенный цикл функционально независим от последних 4 строк — одну или другую следует заменить жестким кодированием. Вы пропустили трассировку, важную часть сообщения об ошибке.

Ответ №1:

pyodbc не поддерживает именованные параметры; вопросительный знак ( ? ) является единственным заполнителем параметра, который мы можем использовать. Кроме того, как указано в ошибке

Параметры должны быть в списке, кортеже или строке

данные строки не могут быть list из dict , они должны быть либо

  • a list из list ,
  • a list из tuple , или
  • a list Row объектов.

Итак, вам нужно сделать

 kp = {'documents': [
{'id': '1', 'keyPhrases': ['sport', 'baseball', 'aliens']},
{'id': '2', 'keyPhrases': ['play', 'capacity', 'tired']},
{'id': '3', 'keyPhrases': ['international', 'balance', 'boring']}
]}

lst = []
for x in kp['documents']:
    for i in x['keyPhrases']:
        lst.append( (i, x['id']) )  # (keyphrases, paragraph_id)
cursor.fast_executemany = True
sql = "INSERT INTO keyphrases2 (keyphrases, paragraph_id) VALUES (?, ?)"
cursor.executemany(sql, lst)