首页 » PHP教程 » phplibsybcsdll技巧_函数计算 Python 连接 SQL Server 小结

phplibsybcsdll技巧_函数计算 Python 连接 SQL Server 小结

duote123 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

函数打算的 runtime 运行时的目录是只读的,以是对付须要利用 apt-get 和 pip 安装依赖的场景,须要将依赖安装在代码目录而不是系统目录。
详细安装方法可以参考《函数打算安装依赖库方法小结》。
而 pymssql 的老版本涉及到编译安装,比常见的二级制安装到本地目录略繁芜一些。

函数打算依赖安装须要有个仿照的 linux 环境,从前我们推举利用 fcli shell 的 sbox ,启动一个靠近生产环境的 docker container 进行依赖安装。
由于有些依赖是平台干系的,在 mac 系统安装的动态链接库无法在函数打算的 linux 环境下运行, pymssql 恰好属于这种情形。
本文我将利用 fc-docker 进行安装和本地测试。

phplibsybcsdll技巧_函数计算 Python 连接 SQL Server 小结

下面的例子是基于函数打算 runtime python3.6 的,对付 python2.7 也进行了测试,同样适用。

phplibsybcsdll技巧_函数计算 Python 连接 SQL Server 小结
(图片来自网络侵删)

准备测试环境

首先利用 docker 在本机 Mac 电脑下运行一个 SQL Server 2017 做事,并初始化表构造,编辑一个 index.py 的测试文件,以验证数据库访问是否成功。

$ 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

$ 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。

$ sqlcmd -S localhost -U SA -P 'Codelife.me'1>CREATE DATABASE TestDB2>SELECT Name from sys.Databases3>GOName-----------------------------------------------mastertempdbmodelmsdbTestDB(5 rows affected)

创建测试数据库 TestDB。

1> USE TestDB2> 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> GOChanged database context to 'TestDB'.(1 rows affected)(1 rows affected)

创建一张 Inventory 表,并参入一行测试数据。

1> SELECT FROM Inventory WHERE quantity > 152;2> GOid name quantity----------- -------------------------------------------------- ----------- 2 orange 154(1 rows affected)1> QUIT

验证一下插入结果并退出。

准备一个测试函数

import pymssqldef 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这里利用了 fc-docker 供应的 python3.6 的仿照环境:aliyunfc/runtime-python3.6第一行启动了一个不会退出的 docker container,第二行利用 docker exec 进入这个 container 安装依赖,末了一行退出该 container。
由于本地路径 $(pwd) 被挂载到 container 内部的 /code 目录,以是 container 退出往后 /code 目录的内容还会保留在本地当前路径下。
pip 通过 -t 参数将 wheel 包安装在 /code 目录下。

$ docker run --rm -v $(pwd):/code aliyunfc/runtime-python3.6 --handler index.handlerrow = (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.6docker exec -t mssql-builder apt-get install -y -d -o=dir::cache=/code libsybdb5docker 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.3docker stop mssql-builder第一行启动一个 container,第十行停滞并自动删除该 container。
第二行至第三行将运行时依赖 libsybdb5 安装于本地目录。
将动态链接库 libsybdb.so.5 链接到目录 /code/lib 目录下,由于该目录默认配置到了环境变量 LD_LIBRARY_PATH 下。
将 freetds-dev 和 cython 安装到系统目录,用于 pymssql 编译安装,由于运行时 pymssql 不须要这两个库,以是无需安装在本地目录安装 2.1.3 版本的 pymssql,从 2.1.4 版本开始已经不须要源码安装了。

$ docker run --rm -v $(pwd):/code aliyunfc/runtime-python3.6 --handler index.handlerrow = (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 场景非常有帮助。

作者:倚贤

标签:

相关文章