函式計算Python連線SQLServer小結
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
` % (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 場景非常有幫助。
參考閱讀
- http://www.pymssql.org/en/latest/intro.html#install
- http://www.freetds.org/
- http://www.pymssql.org/en/stable/pymssql_examples.html
- https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-2017
- https://cloudblogs.microsoft.com/sqlserver/2017/05/16/sql-server-command-line-tools-for-macos-released/
相關文章
- 函式計算安裝依賴庫方法小結函式
- 函式小結函式
- MySQL字串連線函式MySql字串函式
- 函式ZwQuerySystemInformation小結函式ORM
- Oracle 函式小結Oracle函式
- RANK函式小結函式
- sqlserver連線oracleSQLServerOracle
- SQLSERVER 連線 ORACLESQLServerOracle
- DBeaver連線SQLServerSQLServer
- OpencV_Python影象濾波函式小結OpenCVPython函式
- 函式計算支援 MySQL 例項繫結函式MySql
- plsql連線故障小結SQL
- SqlServer常用函式SQLServer函式
- mysql 字元函式小結MySql字元函式
- Dockerfile 修改,連線 sqlserverDockerSQLServer
- myeclipse連線sqlserverEclipseSQLServer
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- python中關於時間和日期函式的常用計算總結Python函式
- 8 連續函式的運算函式
- SQLSERVER日期函式(zt)SQLServer函式
- SqlServer——系統函式SQLServer函式
- sqlserver DATEPART函式使用SQLServer函式
- Oracle 左外連線、右外連線、全外連線小總結Oracle
- 函式計算: 讓小程式開發進入 Serverless 時代函式Server
- 計算日期的函式函式
- php陣列函式小結PHP陣列函式
- 檢視sqlserver連線數SQLServer
- WEKA連線MySQL,Oracle,SQLServerMySqlOracleServer
- Sqlserver修改連線密碼SQLServer密碼
- python連線clickhouse資料庫的兩種方式小結Python資料庫
- 從雲端計算到函式計算函式
- SqlServer——字串處理函式SQLServer字串函式
- python用time函式計算程式執行時間Python函式
- PHP連結oracle的函式 (轉)PHPOracle函式
- 函式計算——應用初探函式
- Mysql中日期計算函式MySql函式
- C語言程式設計>第八週 ② 編寫函式fun,函式的功能是:根據以下公式計算,計算結果作為函式值返回。C語言程式設計函式公式
- C/C++ 陣列連結串列表示式計算C++陣列