Python SQL 连接 - PypyodbC语言 序列项 0:预期的 str 实例,找到的字节数



我有一个函数,当传递数据库、表和访问详细信息时,它会连接到 SQL Server 中的表,以读取要导出到 pandas 数据帧的所有内容

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

大多数情况下,这工作正常,但是,由于我无法确定的原因,我得到了此错误

sequence item 0: expected str instance, bytes found

是什么原因造成的,我该如何解释?

感谢!

我找到了一种更好的方法将数据从SQL提取到熊猫

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

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

cursor.fetchone()

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

可能是如果您深入了解可能对您有所帮助的特定数据行。

我还在这里发现了另一个类似的问题 - 点击这里

可能是这个 URL(Microsoft ODBC 驱动程序的已知问题(也可能有所帮助 - 点击这里

我在使用 python 3时遇到了同样的错误,如下所示:我将 MS SQL 列定义为 nchar,存储了一个空字符串(在 python 3 中是 unicode(,然后使用 pypyodbc 调用 cursor.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 修复了它。

最新更新