函数计算 Python 连接 SQL Server 小结
python 連接數(shù)據(jù)庫通常要安裝第三方模塊,連接 MS SQL Server 需要安裝?pymssql?。由于 pymsql 依賴于?FreeTDS,對于先于 2.1.3 版本的 pymssql,需要先安裝 FreeTDS。由于早期版本的 pymssql 只提供了 windows 下的 wheel 打包,其他平臺(如 linux)需要從源碼包編譯安裝,那需要先安裝 freetds-dev 包,以提供必要的頭文件。
函數(shù)計(jì)算的 runtime 運(yùn)行時(shí)的目錄是只讀的,所以對于需要使用 apt-get 和 pip 安裝依賴的場景,需要將依賴安裝在代碼目錄而不是系統(tǒng)目錄。具體安裝方法可以參考《函數(shù)計(jì)算安裝依賴庫方法小結(jié)》。而 pymssql 的老版本涉及到編譯安裝,比常見的二級制安裝到本地目錄略復(fù)雜一些。
函數(shù)計(jì)算依賴安裝需要有個(gè)模擬的 linux 環(huán)境,從前我們推薦使用 fcli shell 的 sbox ,啟動一個(gè)接近生產(chǎn)環(huán)境的 docker container 進(jìn)行依賴安裝。因?yàn)橛行┮蕾囀瞧脚_相關(guān)的,在 mac 系統(tǒng)安裝的動態(tài)鏈接庫無法在函數(shù)計(jì)算的 linux 環(huán)境下運(yùn)行, pymssql 恰好屬于這種情況。本文我將使用?fc-docker進(jìn)行安裝和本地測試。
下面的例子是基于函數(shù)計(jì)算 runtime python3.6 的,對于 python2.7 也進(jìn)行了測試,同樣適用。
準(zhǔn)備測試環(huán)境
首先使用 docker 在本機(jī) Mac 電腦下運(yùn)行一個(gè) SQL Server 2017 服務(wù),并初始化表結(jié)構(gòu),編輯一個(gè) index.py 的測試文件,以驗(yàn)證數(shù)據(jù)庫訪問是否成功。
$ 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 端口,并設(shè)定 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)創(chuàng)建測試數(shù)據(jù)庫 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)創(chuàng)建一張 Inventory 表,并參入一行測試數(shù)據(jù)。
1> SELECT * FROM Inventory WHERE quantity > 152; 2> GO id name quantity ----------- -------------------------------------------------- ----------- 2 orange 154 (1 rows affected) 1> QUIT驗(yàn)證一下插入結(jié)果并退出。
準(zhǔn)備一個(gè)測試函數(shù)
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編寫一個(gè)測試函數(shù) index.py。該函數(shù)連接 mac 宿主機(jī)docker.for.mac.host.internal?(這里不能是 localhost,因?yàn)?fc-docker 會將函數(shù)運(yùn)行在 container 內(nèi)部)的 SQL Server 服務(wù)。執(zhí)行一個(gè)查詢,并把結(jié)果返回出來。
最新版的 pymssql
創(chuàng)建一個(gè)空目錄,存放上 index.py 文件。將命令會話的當(dāng)前路徑切換到 index.py 所在的目錄,然后執(zhí)行
$ 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執(zhí)行上面命令可以順利返回結(jié)果。對于不需要使用老本 pymssql 的用戶看到這里就可以結(jié)束了。
早期版本的 pymssql
對于早于 2.1.3 版本的 pymssql, pip install 會觸發(fā)源碼編譯安裝,對于這種情況,需要安裝編譯時(shí)依賴的 freetds-dev,以及運(yùn)行時(shí)依賴的 libsybdb5。編譯時(shí)依賴可以直接安裝在系統(tǒng)目錄里,運(yùn)行時(shí)依賴必須安裝在本地目錄下。
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 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測試通過。
小結(jié)
這是一份來遲的函數(shù)計(jì)算使用 sql server 數(shù)據(jù)庫的配置文檔。當(dāng)前版本的 pymssql 已經(jīng)不再需要源碼安裝了。但是 pip 源碼包安裝的方法,對于其他類似的場景也是適用的。
本文也提供了一種基于 fc-docker 的配置和調(diào)試方法,不同 fcli 的 sbox,fc-docker 可以寫成腳本反復(fù)執(zhí)行,并且也可以用于本地模擬執(zhí)行,對于 CI 場景非常有幫助。
?
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/yunqishequ/p/9999615.html
總結(jié)
以上是生活随笔為你收集整理的函数计算 Python 连接 SQL Server 小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三、单一职责原则、开放-封闭原则、依赖倒
- 下一篇: Python(七) 元组+集合+随机+s