摘要: python 链接数据库一般要安装第三方模块,链接 MS SQL Server 须要安装 pymssql 。因为 pymsql 依赖于 FreeTDS,对于先于 2.1.3 版本的 pymssql,须要先安装 FreeTDS。html
python 链接数据库一般要安装第三方模块,链接 MS SQL Server 须要安装 pymssql 。因为 pymsql 依赖于 FreeTDS,对于先于 2.1.3 版本的 pymssql,须要先安装 FreeTDS。因为早期版本的 pymssql 只提供了 windows 下的 wheel 打包,其余平台(如 linux)须要从源码包编译安装,那须要先安装 freetds-dev 包,以提供必要的头文件。python
函数计算的 runtime 运行时的目录是只读的,因此对于须要使用 apt-get 和 pip 安装依赖的场景,须要将依赖安装在代码目录而不是系统目录。具体安装方法能够参考《函数计算安装依赖库方法小结》。而 pymssql 的老版本涉及到编译安装,比常见的二级制安装到本地目录略复杂一些。linux
函数计算依赖安装须要有个模拟的 linux 环境,从前咱们推荐使用 fcli shell 的 sbox ,启动一个接近生产环境的 docker container 进行依赖安装。由于有些依赖是平台相关的,在 mac 系统安装的动态连接库没法在函数计算的 linux 环境下运行, pymssql 刚好属于这种状况。本文我将使用 fc-docker进行安装和本地测试。git
下面的例子是基于函数计算 runtime python3.6 的,对于 python2.7 也进行了测试,一样适用。github
首先使用 docker 在本机 Mac 电脑下运行一个 SQL Server 2017 服务,并初始化表结构,编辑一个 index.py 的测试文件,以验证数据库访问是否成功。sql
$ docker pull mcr.microsoft.com/mssql/server:2017-latest $ docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Codelife.me' \ -p 1433:1433 --name sql1 \ -d mcr.microsoft.com/mssql/server:2017-latest
将 SQL Server 启动于 1433 端口,并设定 SA 帐户密码为 Codelife.me
docker
$ brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release $ brew update $ ACCEPT_EULA=y brew install --no-sandbox msodbcsql mssql-tools
使用 homebrew 安装 mssql 客户端 sqlcmd。shell
$ sqlcmd -S localhost -U SA -P 'Codelife.me' 1>CREATE DATABASE TestDB 2>SELECT Name from sys.Databases 3>GO Name ----------------------------------------------- master tempdb model msdb TestDB (5 rows affected)
建立测试数据库 TestDB。数据库
1> USE TestDB 2> CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT) 3> INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154); 4> GO Changed database context to 'TestDB'. (1 rows affected) (1 rows affected)
建立一张 Inventory 表,并参入一行测试数据。macos
1> SELECT * FROM Inventory WHERE quantity > 152; 2> GO id name quantity ----------- -------------------------------------------------- ----------- 2 orange 154 (1 rows affected) 1> QUIT
验证一下插入结果并退出。
import pymssql def handler(event, context): conn = pymssql.connect( host=r'docker.for.mac.host.internal', user=r'SA', password=r'Codelife.me', database='TestDB' ) cursor = conn.cursor() cursor.execute('SELECT * FROM inventory WHERE quantity > 152') result = '' for row in cursor: result += 'row = %r\n' % (row,) conn.close() return result
编写一个测试函数 index.py。该函数链接 mac 宿主机docker.for.mac.host.internal
(这里不能是 localhost,由于 fc-docker 会将函数运行在 container 内部)的 SQL Server 服务。执行一个查询,并把结果返回出来。
建立一个空目录,存放上 index.py 文件。将命令会话的当前路径切换到 index.py 所在的目录,而后执行
$ docker run --rm --name mssql-builder -t -d -v $(pwd):/code --entrypoint /bin/sh aliyunfc/runtime-python3.6 $ docker exec -t mssql-builder pip install -t /code pymssql $ docker stop mssql-builder
$ docker run --rm -v $(pwd):/code aliyunfc/runtime-python3.6 --handler index.handler row = (2, 'orange', 154) RequestId: d66496e9-4056-492b-98d9-5bf51e448174 Billed Duration: 144 ms Memory Size: 19
执行上面命令能够顺利返回结果。对于不须要使用老本 pymssql 的用户看到这里就能够结束了。
对于早于 2.1.3 版本的 pymssql, pip install 会触发源码编译安装,对于这种状况,须要安装编译时依赖的 freetds-dev,以及运行时依赖的 libsybdb5。编译时依赖能够直接安装在系统目录里,运行时依赖必须安装在本地目录下。
docker run --rm --name mssql-builder -t -d -v $(pwd):/code --entrypoint /bin/sh aliyunfc/runtime-python3.6 docker exec -t mssql-builder apt-get install -y -d -o=dir::cache=/code libsybdb5 docker exec -t mssql-builder bash -c 'for f in $(ls /code/archives/*.deb); do dpkg -x $f $(pwd) ; done;' docker exec -t mssql-builder bash -c "rm -rf /code/archives/; mkdir /code/lib;cd /code/lib; ln -sf ../usr/lib/x86_64-linux-gnu/libsybdb.so.5 ." docker exec -t mssql-builder apt-get install -y freetds-dev docker exec -t mssql-builder pip install cython docker exec -t mssql-builder pip install -t /code pymssql==2.1.3 docker stop mssql-builder
$ docker run --rm -v $(pwd):/code aliyunfc/runtime-python3.6 --handler index.handler row = (2, 'orange', 154) RequestId: d66496e9-4056-492b-98d9-5bf51e448174 Billed Duration: 144 ms Memory Size: 19
测试经过。
这是一份来迟的函数计算使用 sql server 数据库的配置文档。当前版本的 pymssql 已经再也不须要源码安装了。可是 pip 源码包安装的方法,对于其余相似的场景也是适用的。
本文也提供了一种基于 fc-docker 的配置和调试方法,不一样 fcli 的 sbox,fc-docker 能够写成脚本反复执行,而且也能够用于本地模拟执行,对于 CI 场景很是有帮助。