我建立了一个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
任何建议/见解表示赞赏!
答案 0 :(得分:2)
请注意cursor.execute
之间的区别:
.execute ( operation [, parameters ])
参数可以作为序列或映射提供,并将绑定到操作中的变量。
.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