TypeError: параметры должны быть в списке, кортеже или строке в Python - PullRequest
0 голосов
/ 27 сентября 2019

Я создал скрипт Python, который извлекает данные из Auth0 и публикует их в Ms-sql, но я получаю ошибки

 for d in data:
        print d["email"], d["created_at"],d["last_login"],d["last_ip"] #this part worked great
        SQLCommand = ("INSERT INTO [dbo].[Auth0_stg] "
                      "([Email],[created_at],[last_login],[last_ip]) "
                      " VALUES(?,?,?,?)")
        Values = d["email"],d['created_at'],d['last_login'],d['last_ip']

        cursor.executemany(SQLCommand,Values)
        cursor.commit()

Когда я выполнял операторы печати,

d['email'], d['last_login']

все напечатано отлично.но когда я использовал команды SQL, чтобы попытаться заполнить свою таблицу, он возвращает эту ошибку

File "C:\Python27\lib\site-packages\pypyodbc.py", line 1454, in execute
    raise TypeError("Params must be in a list, tuple, or Row")
TypeError: Params must be in a list, tuple, or Row

Любые предложения / идеи приветствуются!

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Обратите внимание на разницу между cursor.execute:

.execute ( operation [, parameters ])

Параметры могут быть представлены как последовательность или отображение и будут привязаны к переменным воперация.

и cursor.executemany:

.executemany ( operation , seq_of_parameters )

Подготовка операции базы данных (запрос или команда)а затем выполнить его для всех последовательностей параметров или отображений, найденных в последовательности seq_of_parameters.

Итак, если вы выполняете свой запрос только для одного набора значений, назовите его так:

SQLCommand = ("INSERT INTO [dbo].[Auth0_stg] "
              "([Email],[created_at],[last_login],[last_ip]) "
              " VALUES(?,?,?,?)")
Values = ['email','created_at','last_login''last_ip']

cursor.executemany(SQLCommand,[Values])
cursor.commit()
1 голос
/ 27 сентября 2019

executemany выполняет один и тот же запрос несколько раз с разными параметрами.Из-за этого он ожидает последовательность в качестве второго параметра (например, список списка или список кортежей ...)

В вашем коде вы хотите сделать только один запрос для каждой итерации вашегоfor петля.Замените executemany на execute, и оно должно работать нормально.

РЕДАКТИРОВАТЬ: Для вашего второго выпуска, перед строкой:

Values = d["email"],d['created_at'],d['last_login'],d['last_ip']

Вы можете заполнить пустые значения с помощью цикла for:

for key in ["email", "created_at", "last_login", "last_ip"]:
    if key not in d:
        d[key] = ""

РЕДАКТИРОВАНИЕ 2: Чтобы создать объект даты и времени из строки, вы можете использовать strptime():

>>> from datetime import datetime
>>> my_str_date = "2016-10-18T20:15:45.454Z"
>>> my_datetime = datetime.strptime(my_str_date, "%Y-%m-%dT%H:%M:%S.%fZ")
>>> print(my_datetime)
2016-10-18 20:15:45.454000

Затем вы можете отформатировать его, используя strftime():

>>> print(my_datetime.strftime("%Y/%m/%d %H:%M:%S"))
2016/10/18 20:15:45
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...