Ubuntu下连接SqlServer,内网环境部署项目,无法访问公网。
项目开发时处在公网环境,已经安装好所需的各种python模块。python包通过conda、apt-get、pip等方式安装。
笔者在base环境进行的这个项目开发,打包前先将base环境复制:
conda create -n base_env --clone base
克隆base来创建一个名为base_env的副本
cd anaconda3
cd envs/
该目录下存有刚刚克隆的base_env副本
tar -zcvf base_env.tar.gz ./base_env/
直接将base_env文件夹打包
base_env.tar.gz就是在内网环境下所需的anaconda环境,其中包含在开发机器上,base环境下安装的所有python包。
在进行该部分工作时,笔者还网上看到联网环境下的anaconda环境迁移:
导出环境:
conda env export > environment.yaml
复现该环境
conda env create -f environment.yaml
这种方法需要保持联网,相当于保存你之前的python包列表,在新机器上给你自动安装。
Anaconda的安装比较简单,网上有很多博客教程。我习惯安装在 /home/hostname/ 目录下。
cd /home/hostname/
bash bash Anaconda3-2019.10-Linux-x86_64.sh
一路填yes,不建议直接敲回车,因为我在安装过程中遇到 by running conda init 这个选项,它默认是no,敲回车即为no,以后每次用anaconda都需手动加载环境变量,很麻烦。如若一路回车,建议卸载重装。
cd anaconda3
cd envs/
在该文件夹下解压 base_env.tar.gz
激活环境
conda activate base_env
这里未探究默认启动base_env环境,重启计算机后仍为base,需要手动激活环境。
我在base_env环境下运行我的代码,但是出现了错误:
ImportError: libsybdb.so.5: cannot open shared object file: No such file or dictionary
按道理不应该啊,所需python包都在啊,而且我还特意通过conda list查看过已安装的所有python包,pymssql也有。于是,百度:
http://www.mamicode.com/info-detail-2153262.html
感谢博主分享,虽然我并未看懂原因,但是可以解决问题,通过一下命令验证成功:
sudo apt-get install freetds-dev
虽然验证成功,但是我的实际部署环境不可访问外网,所以需要下载离线包:
下载地址:http://www.freetds.org
安装配置,参考一下两篇博客:
https://www.xuebuyuan.com/721039.html
https://www.cnblogs.com/hellojesson/p/11481502.html
我将下载好的 freetds-1.1.24.tar.gz 放在 /home/hostname/ 目录下,并将其解压。
cd freetds-1.1.24
sudo ./configure --prefix=/usr/local/freetds --with-tdsver=7.3 --enable-msdblib --enable-dbmfix --with-gnu-ld --enable-shared--enable-static
sudo make
sudo make install
sudo echo "/usr/local/freetds/lib" >> /etc/ld.so.conf.d/freetds.conf
sudo ldconfig
实际部署需要根据freestds和SqlServer版本确定tdsver版本号:
https://www.freetds.org/userguide/
https://www.freetds.org/userguide/choosingtdsprotocol.htm
若需要文件权限,直接 sudo chmod 777。
这一步直接 python test.py 就好了。
PS:我在局域网下进行测试,程序在Ubuntu16.04上,SqlServer在另一台win10上。出现以下错误:
pymssql.OperationalError: (20009, b'DB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (SZS\\SQLEXPRESS)\n')
我ping了一下win10的IP,发现能通,而且win10可以远程连接Ubuntu上的mysql,找了很长时间原因,网上教程多为以下解决方案:https://www.cnblogs.com/xifengmo/p/10993287.html
但是我发现我的SqlServer网络配置全都没问题,端口为默认1433。
最后想到防火墙的问题,关掉Windows防火墙,成功。