python-sql连接pypyodbc序列项0:应为str实例,找到个字节

2024-04-20 09:38:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,当传递数据库时,表和访问详细信息将连接到SQL server中的表,以读取导出到熊猫数据帧的所有内容

def GET_DATA(source_server, source_database, source_table, source_username, source_password):

    print('******* GETTING DATA ' ,source_server, '.', source_database,'.' ,source_table,'.' ,source_username , '*******')
    data_collected = []

    #SOURCE 
    connection = pypyodbc.connect('Driver={ODBC Driver 17 for SQL Server};'
                                'Server=' + source_server + ';'
                                'Database=' + source_database + ' ;'
                                'uid=' + source_username + ';pwd=' + source_password + '')


    #OPEN THE CONNECTION 
    cursor = connection.cursor()

    #BUILD THE COMMAND 
    SQLCommand = ("SELECT * FROM " + source_database +".dbo." + source_table )


    #RUN THE QUERY 
    cursor.execute(SQLCommand)

    #GET RESULTS 
    results = cursor.fetchone()

    columnList = [tuple[0] for tuple in cursor.description]
    #print(type(columnList))

    while results: 

        data_collected.append(results)
        results = cursor.fetchone()

    df_column = pd.DataFrame(columnList)
    df_column = df_column.transpose()
    df_result = pd.DataFrame(data_collected)
    frames = [df_column,df_result]

    df = pd.concat(frames)
    print('GET_DATA COMPLETE!')

    return df

但是,大多数情况下,这个方法都很好,因为我不能确定的原因,我得到了这个错误

^{pr2}$

是什么造成的?我该怎么解释?在

谢谢!在


Tags: thesourcedfdatagetservertableusername
3条回答

我在我的一个项目中也遇到过类似的问题。此异常由microsoft ODBC驱动程序引发。据我说,这个问题可能是在从数据库获取结果时发生的。可能在排队

cursor.fetchone()

根据我之前的理解,出现这种异常的原因是从SQLServer接收到Python的数据的大小。数据库中可能有一个特定的大行导致了这个问题。如果行包含unicode字符或非ascii字符,则驱动程序超出了缓冲区长度,驱动程序无法将nvarchar转换为字节,也无法将bytes对象转换回string。当驱动程序遇到某些特殊字符时,它有时无法将bytes对象转换回字符串,因此会出现错误。驱动程序将一个bytes对象发送回python。我想这就是例外的原因。在

可能是如果你深入到某个特定的数据行,可能会对你有所帮助。在

我在这里也发现了另一个类似的问题-Click here

可能这个URL(Microsoft ODBC驱动程序的已知问题)可能也有帮助-Click here

我发现了一种更好的方法,可以将SQL中的数据提取到pandas中

import pyodbc 
import pandas as pd

def GET_DATA_TO_PANDAS(source_server,source_database, source_table,source_username,source_password):
        print('***** STARTING DATA TO PANDAS ********* ')
        con = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};'
                                    'Server=' + source_server + ';'
                                    'Database=' + source_database + ' ;'
                                    'uid=' + source_username + ';pwd=' + source_password + '')




        #BUILD QUERY 
        query = "SELECT * FROM " + source_database + ".dbo." + source_table
        df = pd.read_sql(query, con)
        return df 

使用了此链接-https://www.quora.com/How-do-I-get-data-directly-from-databases-DB2-Oracle-MS-SQL-Server-into-Pandas-DataFrames-using-Python

我在使用python3时遇到了相同的错误,如下所示:我将mssql列定义为nchar,存储了一个空字符串(在python3中是unicode),然后使用pypyodbc调用检索行游标.fetchone(). 在这条线上失败了:

if raw_data_parts != []:
     if py_v3:
         if target_type != SQL_C_BINARY:
             raw_value = ''.join(raw_data_parts) 
             # FAILS WITH "sequence item 0: expected str instance, bytes found"
      ....

将数据库中的列数据类型更改为nvarchar将其修复。在

相关问题 更多 >