Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python Dataframe将数据插入Sql server时出现问题_Python_Sql Server_Pandas - Fatal编程技术网

使用Python Dataframe将数据插入Sql server时出现问题

使用Python Dataframe将数据插入Sql server时出现问题,python,sql-server,pandas,Python,Sql Server,Pandas,我试图从RESTAPI中提取数据并将其插入SQL Server。如果我们让脚本一起执行PhotoBinary、Filetype,它就可以工作了,但是只要我添加一个整数ID,我们就会得到下面的错误。另外,如果我只是让它自己从API中提取ID,它就会工作 我正在尝试提取3条信息 EmployeeID,它是一个int 图像的二进制字符串表示形式 原始文件的文件类型,例如:.jpg 目标表设置为: Create table Employee_Photo ( EmployeeID int,

我试图从RESTAPI中提取数据并将其插入SQL Server。如果我们让脚本一起执行PhotoBinary、Filetype,它就可以工作了,但是只要我添加一个整数ID,我们就会得到下面的错误。另外,如果我只是让它自己从API中提取ID,它就会工作

我正在尝试提取3条信息

  • EmployeeID,它是一个int
  • 图像的二进制字符串表示形式
  • 原始文件的文件类型,例如:.jpg
  • 目标表设置为:

    Create table Employee_Photo
    ( 
        EmployeeID  int,
        PhotoBinary varchar(max),
        FileType varchar(10)
    )
    
    我得到的错误是:

    Traceback (most recent call last):
      File "apiphotopullwithid.py", line 64, in <module>
        cursor.execute("INSERT INTO dbo.Employee_Photo([EmployeeID],[PhotoBinary],[FileType]) values (?,?,?)", row['EMPID'],row['Photo'],row['PhotoType'])
    pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 5 (""): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision. (8023) (SQLExecDirectW)')
    
    您正在使用旧的Windows内置SQL Server驱动程序。试试新的,你可以从多个平台上获得

    不要对错误消息读得太多。网络协议层中存在格式错误

    您可以转储导致问题的参数的类型和值吗。我的猜测是驱动程序设置的参数类型不正确

    例如:

    您正在使用旧的Windows内置SQL Server驱动程序。试试新的,你可以从多个平台上获得

    不要对错误消息读得太多。网络协议层中存在格式错误

    您可以转储导致问题的参数的类型和值吗。我的猜测是驱动程序设置的参数类型不正确

    例如:


    在大多数Python数据库API(包括遵守规范的pyodbc)中,
    cursor.execute()
    中的参数参数通常是一个序列(即元组、列表)。因此,将所有值绑定到一个iterable中,而不是作为三个单独的参数值:

    sql = "INSERT INTO dbo.Employee_Photo ([EmployeeID],[PhotoBinary],[FileType]) VALUES (?,?,?)"
    
    # TUPLE
    cursor.execute(sql, (row['EMPID'], row['Photo'], row['PhotoType']))
    
    # LIST
    cursor.execute(sql, [row['EMPID'], row['Photo'], row['PhotoType']])
    
    顺便说一句,避免显式的
    iterrows
    循环,并在使用Pandas'时使用隐式循环:


    实际上,您甚至不需要将Pandas作为中间层(仅将库用于数据科学)并与原始返回的json进行交互:

    # NESTED LIST OF TUPLES
    vals = [(int(device[u'ID']), device[u'Photo'], device[u'PhotoType']) \
               for device in data['PersonPhoto']]
    
    cursor.executemany(sql, vals)   
    conn.commit()
    

    在大多数Python数据库API(包括遵守规范的pyodbc)中,
    cursor.execute()
    中的参数参数通常是一个序列(即元组、列表)。因此,将所有值绑定到一个iterable中,而不是作为三个单独的参数值:

    sql = "INSERT INTO dbo.Employee_Photo ([EmployeeID],[PhotoBinary],[FileType]) VALUES (?,?,?)"
    
    # TUPLE
    cursor.execute(sql, (row['EMPID'], row['Photo'], row['PhotoType']))
    
    # LIST
    cursor.execute(sql, [row['EMPID'], row['Photo'], row['PhotoType']])
    
    顺便说一句,避免显式的
    iterrows
    循环,并在使用Pandas'时使用隐式循环:


    实际上,您甚至不需要将Pandas作为中间层(仅将库用于数据科学)并与原始返回的json进行交互:

    # NESTED LIST OF TUPLES
    vals = [(int(device[u'ID']), device[u'Photo'], device[u'PhotoType']) \
               for device in data['PersonPhoto']]
    
    cursor.executemany(sql, vals)   
    conn.commit()
    

    你读到错误了吗?“提供的值不是数据类型float的有效实例。请检查源数据中的无效值。”我确实这样做了。如果我自己为3列中的任何一列运行脚本,则该过程将正常工作。问题似乎是当它们结合在一起时,我得到了错误。这似乎是因为当第二列和第三列为空时Pandas对数据所做的事情。它似乎将Int转换为Float。您能否修改python程序,以便以自包含的方式重新生成错误?例如,删除API调用并插入文本值。我已尝试将API的响应输出到屏幕上,它正确显示为int而不是float。熊猫部分似乎正在进行转换。您读到错误了吗?“提供的值不是数据类型float的有效实例。请检查源数据中的无效值。”我确实这样做了。如果我自己为3列中的任何一列运行脚本,则该过程将正常工作。问题似乎是当它们结合在一起时,我得到了错误。这似乎是因为当第二列和第三列为空时Pandas对数据所做的事情。它似乎将Int转换为Float。您能否修改python程序,以便以自包含的方式重新生成错误?例如,删除API调用并插入文本值。我已尝试将API的响应输出到屏幕上,它正确显示为int而不是float。熊猫部分似乎正在进行转换。我尝试切换到“用于SQL Server的ODBC驱动程序13”,该驱动程序是在我安装Python和PYODBC时添加到我的笔记本电脑中的。目标SQL Server运行的是2014标准版。我也刚刚尝试了最新的驱动程序,它产生了相同的结果。我尝试切换到“SQL Server的ODBC驱动程序13“这是在我安装Python和PYODBC时添加到我的笔记本电脑中的。目标SQL Server运行的是2014标准版。我也刚刚尝试了最新的驱动程序,它产生了相同的结果。感谢脚本上面的代码片段和信息现在可以工作。感谢脚本上面的代码片段和信息现在可以工作。