函数计算 Python 链接 SQL Server 小结

摘要: 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.medocker

$ 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 服务。执行一个查询,并把结果返回出来。

最新版的 pymssql

建立一个空目录,存放上 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
  1. 这里使用了 fc-docker 提供的 python3.6 的模拟环境:aliyunfc/runtime-python3.6
  2. 第一行启动了一个不会退出的 docker container,第二行使用 docker exec 进入这个 container 安装依赖,最后一行退出该 container。由于本地路径 $(pwd) 被挂载到 container 内部的 /code 目录,因此 container 退出之后 /code 目录的内容还会保留在本地当前路径下。
  3. pip 经过 -t 参数将 wheel 包安装在 /code 目录下。
$ 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 的用户看到这里就能够结束了。

早期版本的 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
  1. 第一行启动一个 container,第十行中止并自动删除该 container。
  2. 第二行至第三行将运行时依赖 libsybdb5 安装于本地目录。
  3. 将动态连接库 libsybdb.so.5 连接到目录 /code/lib 目录下,由于该目录默认配置到了环境变量 LD_LIBRARY_PATH 下。
  4. 将 freetds-dev 和 cython 安装到系统目录,用于 pymssql 编译安装,由于运行时 pymssql 不须要这两个库,因此无需安装在本地目录
  5. 安装 2.1.3 版本的 pymssql,从 2.1.4 版本开始已经不须要源码安装了。
$ 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 场景很是有帮助。

参考阅读

  1. http://www.pymssql.org/en/latest/intro.html#install
  2. http://www.freetds.org/
  3. http://www.pymssql.org/en/stable/pymssql_examples.html
  4. https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-2017
  5. https://cloudblogs.microsoft.com/sqlserver/2017/05/16/sql-server-command-line-tools-for-macos-released/

原文连接

相关文章
相关标签/搜索