#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)