【问题标题】:Inserting JSON Data into SQL Server with Python使用 Python 将 JSON 数据插入 SQL Server
【发布时间】:2014-04-17 17:17:33
【问题描述】:

我有一个 python 脚本,它调用 API、提交请求,然后应该将结果插入到 Sql Server 2012 表中。当它去执行插入到 SQL 中时,它会中断。我目前正在将 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 服务器驱动程序][SQL Server]“@P1”附近的语法不正确。 (102) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server 驱动程序][SQL 服务器]无法准备语句。 (8180)"

如果我能得到任何帮助,我将不胜感激。此时我已经搜索并尝试了几种不同的方法,唯一改变的是错误。

【问题讨论】:

    标签: python sql sql-server json


    【解决方案1】:

    cursor.execute() 的第二个参数必须是要插入的值的序列,对应于语句中的每个 SQL 参数。

    您改为给 ODBC 一个字符串,它也是一个序列,但包含的元素(字符)比查询所需的多。

    在这里使用单元素元组:

    cursor.execute("Insert Into Ticket_Info values (?)", (json.dumps(record),))
    

    根据SQL Server INSERT syntax,我还在值部分加上括号:

    VALUES
    介绍要插入的数据值列表。 column_list(如果指定)或表中的每一列都必须有一个数据值。 值列表必须用括号括起来。

    除非Ticket_Info 每行只有 一个 列(不太可能,您至少会有一个主键列),否则您可能需要指定要将值插入到哪个列:

    cursor.execute("Insert Into Ticket_Info (<columnname>) values (?)", (json.dumps(record),))
    

    您需要将&lt;columnname&gt; 替换为表中的实际列名。

    【讨论】:

    • 我再次执行脚本:'for record in response: print(json.dumps(record)) cursor.execute("Insert Into Ticket_Info values ?", (json.dumps(record), )) cursor.commit() cursor.close() conn.close()' 我仍然遇到同样的错误。
    • @William:我现在还解决了第二个问题; VALUES 后面的括号是必需的。
    • 甜蜜!摆脱了那个错误,但现在我有了一个新错误。 pyodbc.Error: ('21S01', '[21S01] [Microsoft][ODBC SQL Server Driver][SQL Server]列名或提供的值的数量与表定义不匹配。(213) (SQLExecDirectW); [ 42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) 无法准备。(8180)') 有什么想法吗?
    • @William:您没有指定列列表; INSERT INTO TICKET_INFO (&lt;column name&gt;) VALUES (?).
    • @William:您必须将每个条目转换为与您的列名匹配的一系列参数每行;对空列使用None。您可以使用executemany() 进行多次插入(使用嵌套结构)。
    猜你喜欢
    • 2022-01-18
    • 2021-02-19
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多