我有一个函数,当传递数据库、表和访问详细信息时,它会连接到 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 修复了它。