我可以访问MS SQL SERVER数据库,从中检索数据以进行分析。我使用Mac,因此可以使用Navicat Essentials for SQL Server访问数据库。这非常有效。但是,我想使用Python访问数据库。我已经为Python 3.4安装了一个虚拟环境,并安装了各种库,包括Numpy,Pandas,Pypyodbc和其他一些库。我在ODBC管理器应用程序中配置了DNS连接,我可以访问一个名为'类别'的表。在数据库中使用Python如下:
import pandas as pd
import pypyodbc
connectionName = pypyodbc.connect('DNS=myDNSName')
queryName 'SELECT ID, CategoryName FROM Category'
retrievedDataDF = pd.io.sql.read_sql(queryName, con=connectionName)
connectionName.close()
print(retrieveDataDF.head())
print(retrieveDataDF.columns)
这似乎工作得很好,除了返回的数据框中的列标题似乎以某种形式的二进制格式表示,在这种情况下,数据框中的列标题是b' i'和b' c'。打印功能的输出是:
b'i' b'c'
0 1 missing
1 2 blue
2 3 red
3 4 green
4 5 yellow
Index([b'i', b'c'], dtype='object')
我以前没有回忆过这个问题,我也无法在线找到类似问题的参考。结果,我无法解决正在发生的事情。
任何建议都将不胜感激。
编辑:在Joris发表评论之后,以下内容可能会有用:
connectionName.cursor().execute(queryName).description
[(b' i',int,11,10,10,0,False),(b' c',str,100,100,100,0,True)]
所有已安装库的版本如下:
从终端
$ env/bin/pip list
appnope(0.1.0)decorator(4.0.4)gnureadline(6.3.3)ipykernel (4.1.1)ipython(4.0.0)ipython-genutils(0.1.0)ipywidgets(4.1.1) jdcal(1.0)Jinja2(2.8)jsonschema(2.5.1)jupyter(1.0.0) jupyter-client(4.1.1)jupyter-console(4.0.3)jupyter-core(4.0.6) MarkupSafe(0.23)matplotlib(1.4.3)mistune(0.7.1)nbconvert(4.0.0) nbformat(4.0.1)nose(1.3.7)notebook(4.0.6)numexpr(2.4.3)numpy (1.10.1)openpyxl(2.2.4)pandas(0.17.0)pandastable(0.4.0)path.py (8.1.2)pexpect(4.0.1)pickleshare(0.5)pip(1.5.6)ptyprocess(0.5) Pygments(2.0.2)pyparsing(2.0.3)pypyodbc(1.3.3)python-dateutil (2.4.2)pytz(2015.6)pyzmq(14.7.0)qtconsole(4.1.0)scipy(0.16.1) setuptools(3.6)simplegeneric(0.8.1)six(1.9.0)terminado(0.5) 龙卷风(4.2.1)traitlets(4.0.0)xlrd(0.9.3)
来自虚拟环境
import pandas as pd
pd.show_versions(as_json=False)
安装版本
commit:无python:3.4.1.final.0 python-bits:64 OS:Darwin 操作系统发布:15.2.0机器:x86_64处理器:i386字节顺序:很少 LC_ALL:无LANG:en_GB.UTF-8
pandas:0.17.0鼻子:1.3.7点子:1.5.6 setuptools:3.6 Cython:无 numpy:1.10.1 scipy:0.16.1 statsmodels:无IPython:4.0.0 sphinx: 无patsy:无dateutil:2.4.2 pytz:2015.6 blosc:无瓶颈: 无表格:无numexpr:2.4.3 matplotlib:1.4.3 openpyxl:2.2.4 xlrd:0.9.3 xlwt:无xlsxwriter:无lxml:无bs4:无html5lib: 无httplib2:无apiclient:无sqlalchemy:无pymysql:无 psycopg2:无
(从那时起,我已经安装了sqlalchemy 1.0.10,但我仍然在尝试使用SQLAlchemy进行连接。)
编辑2
无法使用sqlalchemy连接创建引擎,因为我无法在运行El Capitan的Mac上安装pyodbc(pip安装失败,因为缺少sql.h头文件而导致致命错误)并且sqlalchemy似乎需要要安装的pyodbc。相反,我通常使用pypyodbc但sqlalchemy不能使用pypyodbc而不是pyodbc。但是,我使用以下方法成功连接到数据库:
phjConnection = pypyodbc.connect(driver="{Actual SQL Server}",server="myServerName",uid="myUserName",pwd="myPassword",db="myDBName",port="1433")
phjQuery = '''SELECT ID, Catagory_Name FROM Catagory'''
phjLatestData = pd.io.sql.read_sql(phjQuery, con=phjConnection)
不确定这是否达到了Joris建议的相同目标,但问题仍然存在,即:
print(phjLatestData.head())
b'i' b'c'
0 1 missing
1 2 blue
2 3 red
3 4 green
4 5 yellow
答案 0 :(得分:2)
这似乎是pypyodbc
驱动程序本身的问题。 Pandas根据从查询结果中获取的信息构造结果数据框的列名,尤其是其description
属性。
如果你手动运行,你会得到(从编辑中复制):
>>> connectionName.cursor().execute(queryName).description
[(b'i', int, 11, 10, 10, 0, False), (b'c', str, 100, 100, 100, 0, True)]
通常,每个元组中的第一个值应该是列名。但是在这里,它只给你第一个字符作为一个字节 对于某些环境(特别是我认为的Python 3)来说,这似乎是一个已知问题,至少它已被报道:https://code.google.com/p/pypyodbc/issues/detail?id=43