使用Python将JSON数据插入SQL Server
我有一个Python脚本,它会调用一个API,提交请求,然后把结果插入到一个Sql Server 2012的表里。当它尝试执行插入操作时,就出错了。目前我在文件中导入了json、requests和pyodbc这几个库。出错的地方在这里:
conn = pyodbc.connect('DRIVER={SQL Server};SERVER={localServer};DATABASE={localDB}')
cursor = conn.cursor()
for record in response:
print(json.dumps(record))
cursor.execute("Insert Into Ticket_Info values ?", json.dumps(record))
cursor.commit()
cursor.close()
conn.close()
出错的地方是在cursor.execute()这一行。运行时我得到了这个错误信息。
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]在'@P1'附近的语法错误。(102) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]语句无法准备。(8180)"
如果能得到任何帮助,我会非常感激。我已经搜索并尝试了几种不同的方法,目前唯一改变的就是错误信息。
1 个回答
在调用 cursor.execute()
的时候,第二个参数必须是一个值的 序列,也就是要插入的值,每个值对应你的 SQL 语句中的一个参数。
你给 ODBC 传了一个字符串,但这个字符串也是一个序列,只不过它包含的元素(字符)比你的查询需要的多得多。
这里应该使用一个只有一个元素的元组:
cursor.execute("Insert Into Ticket_Info values (?)", (json.dumps(record),))
我还在值的部分加了括号,这符合 SQL Server 的 INSERT
语法:
VALUES
用来引入要插入的数据值列表。如果指定了列列表,每一列都必须有一个数据值,或者在表中也必须有一个数据值。值的列表必须用括号括起来。
除非 Ticket_Info
每行只有 一个 列(这不太可能,至少会有一个主键列),否则你可能需要指定你要插入的值对应的列:
cursor.execute("Insert Into Ticket_Info (<columnname>) values (?)", (json.dumps(record),))
在这里你需要把 <columnname>
替换成你表中实际的列名。