百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

函数计算 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
  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 场景非常有帮助。

作者:倚贤

相关推荐

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注入攻击需要从代码开发、数据库配置到安全运维的全流程防护。以下是详细且可操作的防护策略和步骤:...

.NET依赖注入实战:基于Autofac的完全指南与代码示例

...

AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类

...

C# winform中chart控件解决显示大量曲线数据卡顿

前言:...

Java静态三剑客(静态内部类/静态方法/静态类)的正确打开方式

作为Java程序员必知的"静态三剑客",它们看似简单却暗藏玄机!本文将带你解锁高阶玩法,避免99%开发者都会踩的坑!一、概念速览(颠覆传统认知)...

生成AutoCAD图纸批量合并代码(autocad怎么合并图纸)

想要生成AutoCAD图纸批量合并的代码。首先,我需要确定他使用哪个版本的AutoCAD,因为不同版本的API可能不同,比如VBA、.NET(C#或VB.NET)或者AutoLISP。不过用户没有具体...

C#从入门到精通(4)—Linq实现集合快速转换、筛选、排序、分组

前言大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在C#开发中需要经常对集合中的数据进行处理,比如我需要将一个Int类型的集合数...

CSnakes:在.NET项目中嵌入Python代码的工具

...

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...

取消回复欢迎 发表评论: