inux下python3 使用pyodbc连接SQL SERVER数据库设置方法
2018年06月07日 10:36:39 ESinker 阅读数:988
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ezitai/article/details/80604321
转载请提供原文出处。谢谢!
最近写个小程序需要用到python连接SQL SERVER 数据库。python连接MSSQL数据库考虑过用pymssql这个包。这个包使用起来相对方便,但是对字符集的支持不是特别好。如果遇到生僻字的话,无法解析并不能返回结果。可能是受制于freetds。因为这个包也是在freetds上写的。总而言之。总而言之决定放弃pymssql,改用pyodbc去连接sqlserver
最开始接触pyodbc以为同样的代码不能跨平台使用,需要改连接串和IP地址。但是后来才知道。其实是可以把windows的代码拿过来什么都不需要该直接在linux上运行的。其实这应该得益于微软官方的驱动。微软的数据库已经可以在linux上运行了。自然而然也就会完善对应的驱动。这样就不再受freetds存在的bug困扰了
废话不说了。开始进入正题。windows下我们直接
pip install pyodbc
就行了。下面主要说下linux下怎么安装。以Ubuntu 16.04 为参考进行说明。
Ubuntu 16.04 安装pyodbc之前我们要先装好微软官方提供的odbc驱动。官方教程地址为
https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017
这里面有多个linux发行版本多个驱动版本的安装说明。还是以Ubuntu16.04来说。请注意
下面的是以
Microsoft ODBC Driver 13.1 for SQL Server
这个驱动名称进行说明的。这非常重要。
1切换到su.避免权限不足
sudo su
2添加官方的驱动源地址
-
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
-
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
3升级源并安装odbc驱动
-
sudo apt-get update
-
sudo ACCEPT_EULA=Y apt-get install msodbcsql
4安装mssql-tool
sudo ACCEPT_EULA=Y apt-get install mssql-tools
5.将mssql-tool保存到系统变量并使之生效
-
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
-
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
-
source ~/.bashrc
以上已经安装完成微软官方提供的ODBC驱动。接下来要正式安装pyodbc了。官方教程地址为
https://github.com/mkleehammer/pyodbc/wiki
这里有安装,配置,使用等详细的说明
安装pyodbc和依赖。
sudo apt install python3-pip
sudo apt install unixodbc-dev
sudo pip3 install pyodbc
然后就可以使用了在linux上也可以直接连接sqlserver数据库了
该教程与官方教程不太一致。官方教程里有需要将DSN配置到系统里。也就是多了一个odbc.ini文件的配置。如果使用DSN连接方式的话。那么如果连接目标发生改变需要修改或增加DSN的配置,将新的IP地址,连接名。添加进去。这种方式比较适合正式生成环境。
现在网上好多关于pyodbc的连接串的说明。但是看起来很乱。连接串不对。也是导致不能跨平台的原因
先看官方提供的连接串
DRIVER={ODBC Driver 11 for SQL Server};SERVER=test;DATABASE=test;UID=user;PWD=password
也就是说如果要获取个connect需要这样写
-
conn = pyodbc.connect(
-
r'DRIVER={ODBC Driver 11 for SQL Server};'
-
r'SERVER=test;'
-
r'DATABASE=test;'
-
r'UID=user;'
-
r'PWD=password'
-
)
说一下
DRIVER={ODBC Driver 11 for SQL Server}
DRIVER 代表直接用driver驱动去连接,而不是用DSN的方式。这两个连接方式有所不同,这里不具体说明。这个DRIVER很多教程都是写成{SQL Server}。 说明下,如果写成这个在linux下是不能连接的。即使你装了官方ODBC驱动。也就是只能在windows下运行。linux下这个driver应该写上安装的驱动的对应名称!需要特别注意这点。说明如下
- {SQL Server} - released with SQL Server 2000
- {SQL Native Client} - released with SQL Server 2005 (also known as version 9.0)
- {SQL Server Native Client 10.0} - released with SQL Server 2008
- {SQL Server Native Client 11.0} - released with SQL Server 2012
- {ODBC Driver 11 for SQL Server} - supports SQL Server 2005 through 2014
- {ODBC Driver 13 for SQL Server} - supports SQL Server 2005 through 2016
- {ODBC Driver 13.1 for SQL Server} - supports SQL Server 2008 through 2016
- {ODBC Driver 17 for SQL Server} - supports SQL Server 2008 through 2017
微软的linux下ODBC驱动应该是在2014年才提供的(只是猜测)并且驱动的名称配置成为。所以我们要把连接串改为我们安装的对应的驱动版本。也就是上面用红色标记出来的版本。ODBC Driver 13.1 for SQL Server
所以最终的连接串应该为
-
conn = pyodbc.connect(
-
r'DRIVER={ODBC Driver 13.1 for SQL Server};'
-
r'SERVER=test;'
-
r'DATABASE=test;'
-
r'UID=user;'
-
r'PWD=password'
-
)
总之这个
ODBC Driver 13.1 for SQL Server
应该是所装驱动的版本。windows下无需考虑这个问题。怎么写都无所谓
另外需要说明下。连接串里没有端口号。端口需要与ip写在一起,并用逗号分隔!
pymssql是冒号。注意它俩之间的不同。
以上为所用的配置说明。欢迎大家留言交换经验