Python和SQL Server 2017的強大功能

Python和SQL Server 2017的強大功能前端

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

做者:Hitendra Patel  git

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

譯文:github

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

 

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

 

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

用例爲Pythonjson

經過從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

相關文章
相關標籤/搜索