Linux上安装和使用pyodbc

标签: 无 分类: 未分类 创建时间:2020-07-17 09:31:08 更新时间:2024-11-23 02:04:25

2021年05月14日
现在直接用:conda install pyodbc,就可以安装pyodbc了,不用这么麻烦了,下面的可以忽略了。

别人写的python代码,其中使用到了pyodbc驱动,原有的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import sys
## 导入当前目录包
sys.path.append('.')

import pyodbc
from pandas.core.frame import DataFrame


class PYSQL:
def __init__(self,DRIVER,SERVER,PORT,UID,PWD,DATABASE):
self.DRIVER = DRIVER
self.PORT = PORT
self.SERVER = SERVER #应该如何设置
self.UID = UID
self.PWD = PWD
self.DATABASE = DATABASE

#连接数据库
def getConn(self):
try:
CONN = "DRIVER=%s;SERVER=%s,%s;DATABASE=%s;UID=%s;PWD=%s" % (self.DRIVER,self.SERVER,self.PORT, self.DATABASE, self.UID, self.PWD)
self.conn = pyodbc.connect(CONN)
cursor = self.conn.cursor()
except:
cursor = self.getConn(self)
return cursor

#执行SQL语句
def execute(self,cursor,sql):
cursor.execute(sql)
data = cursor.fetchall()
cols = cursor.description
self.conn.commit()
col = []
for i in cols:
col.append(i[0])
data = list(map(list,data))
data = DataFrame(data,columns=col)
return data

当我使用conda安装了pyodbc依赖后,执行python名路,结果出现了:pyodbc.Error: (‘01000’, “[01000] [unixODBC][Driver Manager]Can’t open lib ‘SQL Server’ : file not found (0) (SQLDriverConnect)”) 错误。于是就开始了解决pyodbc连接的问题。

刚开始的时候,我使用了在微软官方提供了脚本下,将下面的内容保存为pyodbc_install.sh,在终端中执行bash pyodbc_install.sh。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo su

#Download appropriate package for the OS version
#RedHat Enterprise Server 8 and Oracle Linux 8
curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/mssql-release.repo

exit
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts
sudo ACCEPT_EULA=Y yum install msodbcsql17
# optional: for bcp and sqlcmd
sudo ACCEPT_EULA=Y yum install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo yum install unixODBC-devel

最后成功了,但还是报错,连接不上

问题二:Data source name not found

参考文章:
1.有关unixODBC:Data source name not found, and no default driver specified的问题 (关于Data source name not found问题的解决方案)
2.odbc.ini Connection String Keywords (unixODBC) (和上篇一样)

几经周折,最终还是解决了。我的系统是CentOS8,主要参考了下面的几篇文章

1
2
## 查看系统版本
cat /etc/redhat-release
参考文章:
1.Install the Microsoft ODBC driver for SQL Server (Linux) (微软提供的方法)
2.Connecting to SQL Server from RHEL 6 or Centos 7 (这篇文章还讲了如何配置odbc源)
3.Connecting to SQL Server from Python app on CentOS 7 (这篇和上篇差不多,但是多了How to uninstall the Microsoft ODBC Driver for Linux)
4.安装 Microsoft ODBC Driver for SQL Server (Linux) (这也是微软的安装方法)

1.分别执行下面的命令,安装unixODBC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/mssql-release.repo

exit
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts
sudo yum install msodbcsql17
# optional: for bcp and sqlcmd
sudo yum install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
# optional: for unixODBC development headers
sudo yum install unixODBC-devel

## 如果直接安装unixODBC-devel不报错,那就不用执行下面的安装,看情况吧
yum install gcc
yum install gcc++
yum install redhat-rpm-config

注意
注意其中的msodbcsql17,这个地方下面还要用的。

2.设置软连接

1
2
3
4
5
# the Microsoft driver expects unixODBC to be here /usr/lib64/libodbc.so.1, so add soft links to the '.so.2' files
cd /usr/lib64
sudo ln -s libodbccr.so.2 libodbccr.so.1
sudo ln -s libodbcinst.so.2 libodbcinst.so.1
sudo ln -s libodbc.so.2 libodbc.so.1

3.设置unixODBC的配置文件路径

1
2
3
4
# Set the path for unixODBC
export ODBCINI=/usr/local/etc/odbc.ini
export ODBCSYSINI=/usr/local/etc
source ~/.bashrc

4.编写一个临时文件

随便找一个地方,编写一个odbcadd.txt文件,然后填写如下的内容,注意Driver,因为我安装的是mssqlserver17,所以写了ODBC Driver 17 for SQL Server,如果对应不上,会报错。其中的Server,填写服务的连接地址和ip,端口用逗号隔开。

1
2
3
4
5
6
7
8
9
# Prepare a temp file for defining the DSN to your database server
vi /home/user/odbcadd.txt

## 内容如下,可以配置多个数据源
[SQLServer]
Driver = ODBC Driver 17 for SQL Server
Description = My MS SQL Server
Trace = No
Server = xxx.xxx.xxx.xxx,5433

5.注册配置文件

将上面的写的配置文件,注册到/etc/odbc.ini中

1
2
# register the SQL Server database DSN information in /etc/odbc.ini
sudo odbcinst -i -s -f /home/user/odbcadd.txt -l

6.检查配置

执行下面的两条命令,检查自己的配置

1
2
3
4
5
6
# check the DSN installation with:
odbcinst -j
cat /etc/odbc.ini

# should contain a section called [MyMSSQLServer]

注意
如果安装和配置完成之后,还是提示没有:Data source name not found and no default driver specified,记得另开一个终端,执行相关的命令。

7.安装pyodbc

使用pip命令安装pyodbc,或者如果使用的是conda,那么就使用conda安装pyodbc,必要的时候可能还需要安装gcc,gcc++

1
2
3
4
# install the python driver for database connection
pip install pyodbc
## or
conda install pyodbc

8.使用pyodbc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import pyodbc
CONN="DSN=SQLServer;database=xxx;uid=xxx;pwd=xxx"
conn = pyodbc.connect(CONN)
cursor = conn.cursor()
sql = "SELECT max(xxx) FROM [dbo].[xxx]"
cursor.execute(sql)
data = cursor.fetchall()
print(data)

cols = cursor.description
print(cols)

cursor.close()
conn.close()

最后成功打印:

9.卸载

这个我没试

1
2
3
4
rm -f /usr/bin/sqlcmd
rm -f /usr/bin/bcp
rm -rf /opt/microsoft/msodbcsql
odbcinst -u -d -n "ODBC Driver 14 for SQL Server"
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。