当前位置: 首页 > Linux

函数计算Python连接SQLServer总结

时间:2023-04-06 06:19:24 Linux

python连接数据库通常需要安装第三方模块,连接MSSQLServer需要安装pymssql。由于pymsql依赖FreeTDS,对于2.1.3之前的pymssql版本,需要先安装FreeTDS。由于pymssql早期版本只提供windows下的wheel打包,其他平台(如linux)需要从源码包编译安装,所以需要先安装freetds-dev包,提供必要的头文件。函数计算的运行时目录是只读的,所以对于需要使用apt-get和pip安装依赖的场景,需要将依赖安装到代码目录,而不是系统目录。具体安装方法请参考《函数计算安装依赖库方法小结》。老版本的pymssql涉及到编译安装,比普通的两级安装到本地目录要复杂一点。FunctionCompute依赖安装需要模拟Linux环境。以前我们推荐使用fclishell的sbox启动一个靠近生产环境的docker容器进行依赖安装。因为有些依赖是平台依赖的,所以在mac系统上安装的动态链接库无法在函数计算的linux环境下运行,pymssql就属于这种情况。在本文中,我将使用fc-docker进行安装和本地测试。下面的例子是基于函数计算运行时python3.6,针对python2.7也进行了测试,同样适用。准备测试环境,首先在本地Mac电脑下使用docker运行一个SQLServer2017服务,初始化表结构,编辑一个index.py的测试文件,验证是否访问数据库成功。$dockerpullmcr.microsoft.com/mssql/server:2017-latest$dockerrun-e'ACCEPT_EULA=Y'-e'SA_PASSWORD=Codelife.me'\-p1433:1433--namesql1\-dmcr。microsoft.com/mssql/server:2017-latest在1433端口启动SQLServer,设置SA账号密码为Codelife.me$brewtapmicrosoft/mssql-releasehttps://github.com/Microsoft/homebrew-mssql-发布$brewupdate$ACCEPT_EULA=ybrewinstall--no-sandboxmsodbcsqlmssql-tools使用homebrew安装mssql客户端sqlcmd。$sqlcmd-Slocalhost-USA-P'Codelife.me'1>CREATEDATABASETestDB2>SELECTNamefromsys.Databases3>GOName----------------------------------------------mastertempdbmodelmsdbTestDB(5rowsaffected)创建一个测试数据库TestDB。1>USETestDB2>CREATETABLEInventory(idINT,nameNVARCHAR(50),quantityINT)3>INSERTINTOInventoryVALUES(1,'banana',150);INSERTINTOInventoryVALUES(2,'orange',154);4>GOChangeddatabasecontextto'TestDB'.(1rowsaffected)(1rowsaffected)创建一个Inventory表并添加一行测试数据。1>SELECT*FROMInventoryWHEREquantity>152;2>GOid名称数量---------------------------------------------------------------------------2orange154(影响1行)1>QUIT验证一键插入结果退出。准备一个测试函数importpymssqldefhandler(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*FROMinventoryWHEREquantity>152')result=''forrowincursor:result+='row=%r\n'%(row,)conn.close()返回结果写一个测试函数index.py。该函数连接mac主机docker.for.mac.host.internal的SQLServer服务(这里不能是localhost,因为fc-docker会在容器内部运行该函数)。执行查询并返回结果。最新版本的pymssql会创建一个空目录来存储index.py文件。将命令会话当前路径切换到index.py所在目录,然后执行$dockerrun--rm--namemssql-builder-t-d-v$(pwd):/code--entrypoint/bin/shaliyunfc/runtime-python3.6$dockerexec-tmssql-builderpipinstall-t/codepymssql$dockerstopmssql-builder这里使用fc-docker提供的python3.6的模拟环境:aliyunfc/runtime-python3.6一行启动一个不会退出的docker容器,第二行使用dockerexec进入容器安装依赖,最后一行退出容器。因为本地路径$(pwd)挂载到容器内部的/code目录,所以/code目录的内容在容器退出后会留在本地当前路径。pip通过-t参数将wheel包安装在/code目录下。$dockerrun--rm-v$(pwd):/codealiyunfc/runtime-python3.6--handlerindex.handlerrow=(2,'orange',154)RequestId:d66496e9-4056-492b-98d9-5bf51e448174计费Duration:144msMemorySize:19执行上面的命令可以顺利返回结果。对于不需要使用原来的pymssql的用户,看到这里就可以结束了。对于更早版本的pymssql,对于2.1.3之前的pymssql版本,pipinstall会触发源码编译安装。此时需要安装编译依赖的freetds-dev和运行时依赖的libsybdb5。编译时依赖可以直接安装在系统目录下,运行时依赖必须安装在本地目录下。dockerrun--rm--namemssql-builder-t-d-v$(pwd):/code--entrypoint/bin/shaliyunfc/runtime-python3.6dockerexec-tmssql-builderapt-getinstall-y-d-o=dir::cache=/codelibsybdb5dockerexec-tmssql-builderbash-c'forfin$(ls/code/archives/*.deb);执行dpkg-x$f$(pwd);done;'dockerexec-tmssql-builderbash-c"rm-rf/code/archives/;mkdir/code/lib;cd/code/lib;ln-sf../usr/lib/x86_64-linux-gnu/libsybdb.so.5."dockerexec-tmssql-builderapt-getinstall-yfreetds-devdockerexec-tmssql-builderpipinstallcythondockerexec-tmssql-builderpipinstall-t/codepymssql==2.1.3dockerstopmssql-builder第一行启动一个容器,第十行停止并自动删除容器。第二到第三行在本地目录下安装运行时依赖libsybdb5。将动态链接库libsybdb.so.5链接到目录/code/lib,因为这个目录默认配置在环境变量LD_LIBRARY_PATH下。将freetds-dev和cython安装到系统目录下进行pymssql的编译安装,因为pymssql在运行时不需要这两个库,所以本地目录下不需要安装pymssql2.1.3版本,从这里已经没有了版本2.1.4需要从源码安装。$dockerrun--rm-v$(pwd):/codealiyunfc/runtime-python3.6--handlerindex.handlerrow=(2,'orange',154)RequestId:d66496e9-4056-492b-98d9-5bf51e448174计费持续时间:144毫秒内存大小:19测试通过。总结这是一篇迟来的使用sqlserver数据库的函数计算的配置文档。当前版本的pymssql不再需要源码安装。不过pip源码包安装的方法同样适用于其他类似场景。本文还提供了基于fc-docker的配置调试方法。fcli、fc-docker不同的sbox,可以写成脚本重复执行,也可以用于本地模拟执行,对CI场景很有帮助。参考阅读http://www.pymssql.org/en/latest/intro.html#installhttp://www.freetds.org/http://www.pymssql.org/en/stable/pymssql_examples.htmlhttps://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-2017https://cloudblogs.microsoft.com/sqlserver/2017/05/16/sql-server-command-line-tools-for-macos-released/本文作者:逸仙阅读原文本文为云栖社区原创内容,未经允许不得转载。