2

有解决方法吗?

我有一个使用 SQL_Latin1_General_CP1_CI_AS 排序规则设置的 MSSQL 表。

engine = create_engine('mssql+pyodbc://'+ServerName+'/'+Database+'?driver='+ServerDriver+'?charset=cp2150')

我可以将它加载到熊猫数据框中

prov_chunk = pd.read_sql('select * from table_name,engine')

但是当我尝试使用 Blaze 时遇到错误

    #Error
C:\Anaconda\envs\care\lib\site-packages\datashape\coretypes.pyc in __init__(self, *args)
    361         except KeyError:
    362             raise ValueError('Unsupported string encoding %s' %
--> 363                              repr(encoding))
    364 
    365         self.encoding = encoding

ValueError: Unsupported string encoding u'SQL_Latin1_General_CP1_CI_AS'

我无法更改排序规则,并希望更多地使用 Blaze 进行我自己的数据分析。有任何想法吗?

4

1 回答 1

2

这是一个迟到的答案,但它可能对某人仍然有用。

datashapeBlaze在检测和验证数据库排序规则时依赖于该包。但是,目前识别的编码集datashape非常少。它们存储在受保护的模块变量_canonical_string_encodings中。从0.5.2 版开始ascii,仅支持、utf-8utf-16和的少数别名,但不支持MySQL 使用的utf-32诸如 yourLatin-1或在我的情况下的编码。utf8mb4_unicode_ci

要解决此问题,可以将新编码添加到_canonical_string_encodings. 使用排序规则,在第一次SQL_Latin1_General_CP1_CI_AS调用方法之前尝试插入以下行:Blaze

import datashape
datashape.coretypes._canonical_string_encodings.update({"SQL_Latin1_General_CP1_CI_AS": "A"})

这些代码行将您的编码密钥添加到字典中,并假装这是一个ascii编码。如果这不起作用(因为您的数据中有不适合ascii编码的字符),请尝试"U8"代替"A". "U8"完成了我的utf8mb4_unicode_ci整理工作。

然而,猴子补丁datashape更像是一种 hack,而不是真正的解决方案。该字典_canonical_string_encodings被标记为受保护,但黑客忽略了这一点。请注意,这可能会导致代码不稳定,因为未来版本datashape可能会更改此变量,恕不另行通知。

于 2016-09-23T09:42:57.267 回答