python 链接数据库一般要安装第三方模块,链接 MS SQL Server 须要安装 pymssql 。因为 pymsql 依赖于 FreeTDS,对于先于 2.1.3 版本的 pymssql,须要先安装 FreeTDS。因为早期版本的 pymssql 只提供了 windows 下的 wheel 打包,其余平台(如 linux)须要从源码包编译安装,那须要先安装 freetds-dev 包,以提供必要的头文件。html
函数计算的 runtime 运行时的目录是只读的,因此对于须要使用 apt-get 和 pip 安装依赖的场景,须要将依赖安装在代码目录而不是系统目录。具体安装方法能够参考《函数计算安装依赖库方法小结》。而 pymssql 的老版本涉及到编译安装,比常见的二级制安装到本地目录略复杂一些。python
函数计算依赖安装须要有个模拟的 linux 环境,从前咱们推荐使用 fcli shell 的 sbox ,启动一个接近生产环境的 docker container 进行依赖安装。由于有些依赖是平台相关的,在 mac 系统安装的动态连接库没法在函数计算的 linux 环境下运行, pymssql 刚好属于这种状况。本文我将使用 fc-docker 进行安装和本地测试。linux
下面的例子是基于函数计算 runtime python3.6 的,对于 python2.7 也进行了测试,一样适用。git
首先使用 docker 在本机 Mac 电脑下运行一个 SQL Server 2017 服务,并初始化表结构,编辑一个 index.py 的测试文件,以验证数据库访问是否成功。github
$ 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
sql
$ 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。docker
$ 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。shell
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 表,并参入一行测试数据。数据库
1> SELECT * FROM Inventory WHERE quantity > 152; 2> GO id name quantity ----------- -------------------------------------------------- ----------- 2 orange 154 (1 rows affected) 1> QUIT
验证一下插入结果并退出。macos
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 场景很是有帮助。
本文做者:倚贤
本文为云栖社区原创内容,未经容许不得转载。