函数计算 Python 连接 SQL Server 小结
liebian365 2024-10-28 17:16 24 浏览 0 评论
python 连接数据库通常要安装第三方模块,连接 MS SQL Server 需要安装 pymssql 。由于 pymsql 依赖于 FreeTDS,对于先于 2.1.3 版本的 pymssql,需要先安装 FreeTDS。由于早期版本的 pymssql 只提供了 windows 下的 wheel 打包,其他平台(如 linux)需要从源码包编译安装,那需要先安装 freetds-dev 包,以提供必要的头文件。
函数计算的 runtime 运行时的目录是只读的,所以对于需要使用 apt-get 和 pip 安装依赖的场景,需要将依赖安装在代码目录而不是系统目录。具体安装方法可以参考《函数计算安装依赖库方法小结》。而 pymssql 的老版本涉及到编译安装,比常见的二级制安装到本地目录略复杂一些。
函数计算依赖安装需要有个模拟的 linux 环境,从前我们推荐使用 fcli shell 的 sbox ,启动一个接近生产环境的 docker container 进行依赖安装。因为有些依赖是平台相关的,在 mac 系统安装的动态链接库无法在函数计算的 linux 环境下运行, pymssql 恰好属于这种情况。本文我将使用 fc-docker 进行安装和本地测试。
下面的例子是基于函数计算 runtime python3.6 的,对于 python2.7 也进行了测试,同样适用。
准备测试环境
首先使用 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 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 表,并参入一行测试数据。
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
- 这里使用了 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.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
- 第一行启动一个 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.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 场景非常有帮助。
作者:倚贤
相关推荐
- C#委托—马工教你轻松玩转委托(c#中委托)
-
前言大家好,我是马工!在C#中有一个小白谈之色变的知识点叫委托,很多学了一两年C#的还不知道委托究竟是什么东西,本文就来帮你彻底解开解惑,从此委托就是小儿科!...
- AR农业种植指导(农业种植模式)
-
以下是一些常见的AR/VR在农业中的应用场景及相关源码示例的一些思路(注意,完整且复杂的源码通常需要根据具体需求和大量开发工作来完成,这里只是简单示例):1.AR农业种植指导-功能描述:通过AR...
- C#中timer中的enable和start以及stop的作用分别是什么?
-
文章来自AI问答的摘录。在C#中,System.Timers.Timer和System.Windows.Forms.Timer都提供了Enabled属性以及Start()和Stop()方法来控制定时器...
- AOP实现原理浅析(简述aop的原理以及作用)
-
在C#中实现一个简单的动态代理框架,可以通过反射和System.Reflection.Emit命名空间动态生成代理类。以下是一个分步指南和示例代码:...
- 如何防止数据库服务器的 SQL 注入攻击
-
如何防止数据库服务器的SQL注入攻击防止SQL注入攻击需要从代码开发、数据库配置到安全运维的全流程防护。以下是详细且可操作的防护策略和步骤:...
- Java静态三剑客(静态内部类/静态方法/静态类)的正确打开方式
-
作为Java程序员必知的"静态三剑客",它们看似简单却暗藏玄机!本文将带你解锁高阶玩法,避免99%开发者都会踩的坑!一、概念速览(颠覆传统认知)...
- 生成AutoCAD图纸批量合并代码(autocad怎么合并图纸)
-
想要生成AutoCAD图纸批量合并的代码。首先,我需要确定他使用哪个版本的AutoCAD,因为不同版本的API可能不同,比如VBA、.NET(C#或VB.NET)或者AutoLISP。不过用户没有具体...
- C#从入门到精通(4)—Linq实现集合快速转换、筛选、排序、分组
-
前言大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在C#开发中需要经常对集合中的数据进行处理,比如我需要将一个Int类型的集合数...
- CSharp(dotNet)绝版面试题,面试大全(二)
-
21.简述C#的密封类和密封方法?C#中,密封类和密封方法都是使用sealed修饰。密封类表示这个类不能被继承。密封方法表示这个方法不能被重写,和virtual方法相对。22.请介绍C#静态构造器的特...
- C#从入门到精通(7)—C#裁剪图像的几种方法总结
-
前言大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在上位机软件开发过程中经常需要裁剪图像,本文就是对c#中常见的裁剪图像方法进行...
- Csharp 进度条的使用(c#进度条是哪个控件)
-
【开发过程】(1)创建一个Windows应用程序,项目名称为Ex047,窗体默认为Form"(2)在窗体中添加菜单、工具栏和状态栏。(3)面添加ProgressBar.设置。(4)在窗体载入Loa...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)