Python和SQL Server 2017的強大功能


Python和SQL Server 2017的強大功能

摘要: 源:https://www.red-gate.com/simple-talk/sql/sql-development/power-python-sql-server-2017/  

作者:Hitendra Patel  

翻譯:謝雪妮 劉瓊濱 許雅莉 賴慧芳

譯文:

Python是SQL Server 2017的新版本。它的主要目的是允許在SQL Server中使用基於python的機器學習但它的用途遠遠不止於此使用任何Python庫或框架提供一個可能的例子Hitendra展示了如何安全地使用該特性來提供智能應用程序緩存,當數據更改時,SQL Server可以自動指示何時觸發緩存刷新。

 

SQL Server 2017已經加入了它的高級分析擴展,現在被稱為“機器學習服務”,通過讓SQL server在TSQL中通過“Python”的機器學習服務來執行Python腳本。這基本上提供了一種方式,數據庫程序員可以直接從Python傳遞數據。它的作用不僅僅是為數據分析提供機器學習能力,因為Python有許多准備好的模塊和框架來解決許多問題,比如使用數據結構進行繁重的計算工作,用於分析、網絡操作、數據庫操作、web操作或基於本地/網絡的文件系統操作的圖形處理。顯然,其中很多都是在中間件中完成的,但是在數據庫系統中,有時候,直接與外部系統進行直接通信比較方便,而不是依賴外部流程來通過輪詢數據源來執行任務。這是有意義的,因為在數據庫或數據層中沒有這樣的解決方案,並且當它沒有提供任何安全問題時,這是沒有問題的。

 

在這里,我們將嘗試展示一個在高級分析擴展中使用Python的例子,顯示數據庫如何觸發外部進程來執行作為參數提供的數據的活動。這是為了考慮安全性、數據可靠性和事務響應時間的問題。

用例為Python

通過從SQL調用Python腳本而不是依賴於中間件,可以更容易地完成一些任務。這是一個特別的情況,任務是由數據庫中的一個事件發起的。任務可能包括

1. 將數據發送到基於網絡的系統之上,或從基於http/soap的基於網絡的系統中接收數據。

2. 利用本地平台資源,如文件系統、網絡或GPU。

3. 通過使用諸如JSON、XML或YAML等通用數據格式構建一個或多個系統之間的實時集成。

4.  通過與外部應用程序的通信來生成數據或文件。

 

自然,沒有什么潛在的劣勢

1. 如果您使用Python需要internet訪問,有一種風險,必須保持安全的數據可能共享在互聯網。任何互聯網接入都必須受到網絡的嚴格監管。

2. 通過允許通過“外部腳本執行”來執行服務器上的Python腳本,從而暴露了安全風險。

3. 同一台服務器上的資源密集型Python腳本可以影響大型OLTP系統上正在進行的事務的性能。

 

權衡利弊,如果Python能夠將風險最小化,那么似乎還有一些場合可以發揮作用。作為一個例子,讓我們考慮如何使用Python構建一個應用層使用的數據緩存系統。

示例解決方案緩存

數據緩存是提高應用程序性能的一種有效方式。對於緩存的存儲開銷,我們可以在面對諸如與數據庫的通信網絡通信之類的問題時獲得有用的性能提升,當面對重復的查詢時,數據庫的資源消耗非常高。當我們構建緩存基礎設施時,我們面臨的常見問題是何時刷新緩存的內容。在一定的時間間隔之后,我們傾向於采用簡單的重建緩存的解決方案。然而,這是非常低效的。在數據更改時刷新緩存更好,只刷新更改的內容。我們可以在數據創建、更新或刪除的時候進行實時處理。有很多工具和框架可用來解決refresh的問題,但是,他們面臨的問題是如何確定數據中發生了什么變化,以及何時發生了更改。數據庫是所有能夠做到這一點的最佳位置。

 

對於我們的緩存系統,它在源代碼中是可用的,我們將把自己限制在微軟的堆棧中,而不使用Python本身。

· Microsoft SQL Server 2017(CPT)

· 服務代理來隔離事務數據庫。

· Python來執行腳本,它可以通過HTTP來更新緩存(從Anaconda發行版使                   用庫的Python 3.5可執行文件)

· .Net 4.5.2

ASP。我們的示例Web UI的Net MVC

ASP。為我們的示例解決方案封裝緩存存儲的網絡WebAPI

 

下面是我們的示例解決方案緩存系統的圖示:

                 

 

WebApplication提供了一個用戶界面來讀取和更新數據。

RESTful。在我們的示例緩存存儲解決方案中,緩存應用程序是用ASP構建的。Net WebAPI2,它的內容類型是JSON。http-get操作從本地緩存(靜態集合)提供數據。

SQL Server 2017(CPT)是一個帶有a的數據庫服務器

      TransDB OLTP數據庫,繁忙的處理事務。

      Cacher是一個執行Python腳本執行的代理數據庫,啟用了啟用了“外部腳本”選項的腳本執行。指的是微軟。Doc:外部腳本啟用了服務器配置選項。

      服務代理是一種可靠的SQL server消息傳遞框架,它有助於連接緩存代理和TransDB。緩存代理接收到的消息可以被處理以更新緩存。

Python是SQL 2017(CPT)的數據庫系統的集成腳本語言。

解決方案的體系結構

在我們的解決方案中,我們將在RESTful中緩存實體的產品類型名稱。緩存應用的程序WebApplication將有一個函數來創建產品類型條目從RESTful.Cache中讀取。

先決條件

順便提一下,我們需要考慮一些先決條件和更多信息。

1. 在托管CacheDB的SQL實例中,必須使用Python安裝的“機器學習服務”

2. 要在CacheDB中執行帶有TSQL的Python腳本,SQL服務MSSQLLaunchpad或SQL Server Launchpad應該運行。指的是微軟。網絡:微軟機器學習服務

3. 使用SP配置啟用外部腳本執行,請參閱Microsoft。Doc:外部腳本啟用了服務器配置選項

 

sp_configure 'external scripts enabled', 1;

  RECONFIGURE;

 

 

4. TransDB和Cacher托管的環境應該有一個在其實例上創建的服務代理端點,如果這些都獨立於兩個不同的SQL實例,那么每個實例都應該有自己的端點。

5. TransDB和Cacher數據庫應該啟用了代理。指的是微軟。技術網:如何:在數據庫中激活服務代理消息傳遞

6. 

ALTER DATABASE TransDB SET ENABLE_BROKER;

  GO

  ALTER DATABASE CacheDB SET ENABLE_BROKER;

  GO

 

 

 

。網絡應用

web應用程序有兩個主要的MVC操作;一個是用HTTP動詞POST更新TransDB中的一個新實體,另一個動作是用HTTP動詞GET從緩存返回產品類型的列表。

             

 

RESTful。緩存有兩種操作方法,一種是使用HTTP謂詞POST更新的實體產品類型,另一種是從本地緩存獲取所有緩存的產品類型。

 

 

對於我們的示例解決方案,這兩個應用程序都在IIS中托管,以保證應用程序的安全。但是對於實際的系統實現,主機環境可以是內部網或internet環境中的單個web服務器。

              

 

RESTful。緩存授權規則只有兩個服務帳戶來處理HTTP請求。

 

 

abc WebApp SVC和abc CacherAgent SVC。abc CacherAgent SVC服務帳戶允許SQL中的Python腳本通過HTTP到達應用程序,以刷新緩存。

abc WebApp SVC用戶為WebApplication提供了授權規則模式,允許訪問RESTful。緩存應用程序。

SQL數據庫和服務代理

OLTP數據庫TransDB有一些對象,包括表、存儲過程和服務代理對象。

 

 

對於我們的目的,過程UpdateProductType更新ProductType表與新記錄和AcknowledgeProductTypeCache過程的激活過程是CacheIntegration隊列,當消息正在處理的時候,它從目標接收到來自目標的確認,例如來自Cacher數據庫。它還可以處理異常,並在cache集成錯誤表中記錄這些異常。

更多關於服務代理的信息可以在微軟找到。DOC:SQL Server服務代理

 

 

對於我們的示例解決方案,TransDB是一個源數據庫,當創建新的ProductType記錄時,它會創建更新緩存消息,要執行一個操作的消息,因為它有UpdateMessage消息類型,一個CacheIntegration合同,它將帶有CacheSource服務的消息發送到數據庫。該服務有一個CacheQueue,該服務由服務代理組件使用,以執行可靠的消息傳遞。ToCacheTarget路由有信息將消息傳遞給目標。

為了消除增加事務處理時間的可能性,並避免在其他數據中出現任何安全風險在事務數據庫中,我們將通過在示例解決方案中使用一個名為Cacher數據庫的代理數據庫來對緩存更新過程進行解耦。服務代理消息傳遞基礎設施將有助於連接跨數據庫和Cacher數據庫,基於事件的消息處理將使我們能夠更新基於網絡的系統的緩存存儲。Cacher數據庫正在扮演代理的角色,以便在更新消息到達時執行緩存刷新。它通過執行Python腳本更新緩存。

 

 

隱藏自己的數據庫有:

CacheLog和cache集成錯誤表,以跟蹤緩存刷新時的情況,並記錄緩存刷新過程中可能發生的任何錯誤。

PerformCacheUpdate過程通過服務代理接收來自TransDB的傳入消息。如果消息的類型是UpdateMessage,那么它將執行另一個過程——UpdateWebCache,它執行Python腳本的執行。UpdateWebCache過程的執行結果保存在一個表變量中,然后在消息對話結束時插入到CacheLog表中。

b .當接收到的消息有錯誤或結束消息類型時,該過程也結束對話,並且,在錯誤類型中,異常日志被寫入cache完整性ationerror表中。

3.UpdateWebCache過程從傳入的XML消息中提取Id和名稱,並將這些值嵌入Python腳本文本中。腳本執行結果集是類型UpddateCacheLog類型的結構化表。

 

 

Cacher的服務代理對象,主要是UpdateMessage消息類型和CacheIntegration合同與TransDB相同,CacheQueue有一個名為PerfomCacheUpdate的激活過程,一個名為CacheTarget的服務,該路由有關於TransDB的服務CacheService和端點地址的信息。

對於我們的示例解決方案,對於兩個數據庫隊列,最大隊列讀取器設置為1。如果需要的話,這可以增加,例如,如果數據修改是高的,並且需要增加緩存刷新率。

服務代理端點

對於我們的解決方案,數據庫是在相同的實例上進行的,所以兩者都使用相同的服務代理端點來發送和接收消息

 

 

但是,如果我們想要在單個實例上駐留數據庫,那么每個SQL實例的服務帳戶都應該有一個服務代理端點。而且,這兩個SQL實例都應該允許將消息發送到對方的端點。可以使用下面的TSQL命令來完成連接的授權和授予。請注意,在消息傳遞基礎結構中,有一個發送方和另一方是接收者,正如前面提到的,如果SQL實例是發送方和接收方的一部分,那么每個實例都應該有自己的進程標識。下面的圖片是每個SQL服務器如何在自己的身份下運行的表示。

 

 

這是在Cacher數據庫SQL實例中授權和授予端點連接到TransDB的SQL實例服務帳戶標識的SQL代碼。

 

 

ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]

  GO

  GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]

  GO

 

 

類似地,這里的代碼是授權和授予Cacher的SQL實例服務帳戶在跨數據庫數據庫中的SQL實例。      

ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC]

  GO

  GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC]

  GO

 

 

Python腳本

下面是Python腳本文本,在TSQL變量@updatecache中保存為字符串。它有一個帶有邏輯的UpdateCache方法,可以對rest進行HTTP POST調用。通過將帶有名稱和Id字段的數據對象傳遞給緩存,這些字段作為輸入

在腳本的末尾,返回的對象被轉換為一個數組,因此可以將其結構化為SQL結果。

DECLARE @UpdateCache NVARCHAR(MAX) = N'

import pandas as PND #data structure package

def UpdateCache(name,id):

  import requests as HTTP #http request package

  #Perfom HTTP POST to update cache

  httpRequest = HTTP.post( http://localhost/RESTful.Cache/ProductType/UpdateCache ,{ Name :name, Id :id})

  cacheLog = httpRequest.json()

  return cacheLog

 

#Update cache and build log element

log = [UpdateCache( '+ @Name+' ,'+ CAST(@Id as VARCHAR(10)) +')]

#Return data frame i.e. table structure from SQL

OutputDataSet = PND.DataFrame(data=log)

 

 

SQL server中使用Python腳本時,有一些事情值得注意。

1. 我們可以編寫一個連續的腳本,或者將它們分組到方法中,就像我們在這個解決方案中所做的那樣。或者,我們可以創建一個內聯類或創建一個包,並在帶有PIP命令的命令提示符中使用python來導入它們。

2. 在這個CPT版本的MS SQL中,import語句可以只在其所在的范圍內導入包,因此我們可以注意到,import請求導入語句存在於方法UpdateCache中,而import語句導入熊貓在sc的頂部存在。

3. 方法UpdateCache的輸出對象立即被轉換為數組,這是熊貓。DataFrame可以將對象轉換為數據結構,SQL server可以輕松地將其解釋為具有行和列的表。

4. 分配給OutputDataSet對象的數據結構可以在SQL server的TSQL執行上下文中提供。

5. 最后一行程序dbo。UpdateWebCache,帶有結果集(類型為dbo.UpdateCacheLog);有一個用戶定義的表類型dbo。UpdateCacheLog幫助保持底層列的順序,避免在生成r的過程中出現任何不匹配的情況。

 

數據安全性

TransDB是一個OLTP數據庫,我們不希望任何針對系統的攻擊出現任何安全漏洞,因此在我們的示例解決方案方法中,這樣的數據庫可以托管在一個SQL實例中,其中沒有安裝“機器學習服務”。Cacher是一種能夠訪問基於網絡的系統的代理,因此可以保留在安裝機器學習服務的SQL實例中。這兩個SQL實例都可以有一個單獨的服務帳戶標識,它已經被授權為特定的端口連接到服務代理端點。安全認證通信的另一種方法是使用證書。對於服務代理端點授權,請參閱Microsoft。技術網:如何:通過使用證書(transact-sql)來允許服務代理網絡訪問,以獲得更多細節。

 

所有組件放在一起

在將所有組件放置到位之后,下面是我們的WebApplication,它允許我們創建一個新的產品類型,並使用基於rest的HTTP調用從刷新的緩存中列出相同的產品類型。在牆后面有一些組件,它們管理數據和緩存對於前端應用程序是不可見的。

        

 

總結

電子商務、醫療保健等應用程序可以從良好的緩存實現中受益。通過擴展我們所熟悉的技術的使用,我們可以得到一個易於維護的解決方案而無需學習一個新的fr

 

我們的示例解決方案滿足了我們的需求

當數據被一個OLTP事務創建或修改時,系統將刷新基於網絡的緩存系統以讀取訪問。

 

它能夠使用異步事件刷新緩存,幾乎是實時的。這不會影響原始事務的性能。

 

它可以通過HTTP在事務性和緩存系統之間繪制一條安全線,以便在OLTP數據庫中保存數據。

 

它啟用了最小的監視功能;緩存日志和異常日志,可以進一步增強以構建管理控制台。

 

在服務代理消息傳遞組件中,當異步消息處理發生時,解決方案足夠靈活,可以觸發或到達基於網絡的系統。換句話說,數據庫集成了SQL服務代理消息傳遞根據接收到的數據,執行一個操作來獲取或將數據發送到數據層之外的外部系統。

 

通過使用服務代理消息傳遞來隔離、外部系統在專用數據庫內觸發事件,有助於確保OLTP數據庫的事務和數據。

 

此項目的源代碼可在githib中使用。https://github.com/hi10p/SQL17Python

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM