TypeError:参数必须在Python中的列表,元组或行中

时间:2019-09-27 14:42:37

标签: python sql sql-server

我建立了一个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 个答案:

答案 0 :(得分:2)

请注意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 :(得分:1)

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