1. 程式人生 > >翻譯:Python和SQL Server 2017的強大功能

翻譯:Python和SQL Server 2017的強大功能

ray app auto 存儲過程 ssa ast 端點 集成 ror

Python和SQL Server 2017的強大功能

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

SQL Server 2017已經增加了它的高級分析擴展,現在被稱為“機器學習服務”,它允許SQL Server通過Python的“機器學習服務”在TSQL中執行Python腳本。這基本上提供了一種方法,可以讓數據庫程序員可以將數據直接傳遞給Python。這不是有限的有效性提供機器學習數據分析的功能,因為Python有許多隨時可用的模塊和框架來解決許多問題,如執行大量計算與數據結構、圖形處理進行分析,網絡操作、數據庫操作、網絡操作或本地/基於網絡文件系統操作。顯然,其中很多都是在中間件中做得最好的,但是在數據庫系統中,有很多時候,直接與外部系統進行直接通信是比較方便的,而不是依靠外部流程來通過輪詢數據源來執行任務。當不需要在數據庫或數據層中有這樣的解決方案時,當它不提供任何安全問題時,這是有意義的。

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

用例為Python

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

1 .工作通過TCP /HTTP/ SOAP向基於網絡的系統發送數據或接收數據。

二。利用本地平臺資源,如文件系統、網絡或GPU。

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

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

當然,很少有潛在的不利因素

1 .工作如果您對Python的使用需要internet訪問,那麽有一個風險,即必須保證安全的數據可能會在internet上意外地共享。任何互聯網接入都必須經過網絡的嚴格監管。

二。允許通過“啟用外部腳本執行”在服務器上執行Python腳本,從而暴露安全風險。

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

權衡這些優點和缺點時,如果Python能夠最大限度地降低風險,那麽它仍然可以發揮有益的作用。作為一個例子,讓我們考慮一下如何使用Python來構建應用程序層使用的數據緩存系統。

示例解決方案緩存

緩存數據可能是提高應用程序性能的一種有效方法。在緩存的存儲開銷上,我們可以在面對類似於數據庫的chatty網絡通信,以及在面對重復查詢時數據庫的高資源消耗時獲得有用的性能收益。當我們構建緩存基礎設施時,我們面臨的常見問題是何時刷新緩存的內容。在一定的時間間隔後,我們傾向於采用簡單的重建緩存的方法。然而,這是非常低效的。當數據發生變化時刷新緩存,並僅刷新已更改的內容,這是更好的做法。當數據被創建、更新或刪除時,我們可以做到這一點。有許多工具和框架可以解決刷新問題,但是它們遇到了如何確定數據中發生了什麽變化以及更改何時發生的問題。數據庫最適合做這些工作。

對於我們的緩存系統,它可以在這裏提供,我們將把自己限制在Microsoft堆棧上,以防止Python本身。

?Microsoft SQL Server 2017(CPT)

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

?Python執行腳本,可以通過HTTP緩存更新(Python 3.5可執行庫從蟒蛇分布)

?。4.5.2凈

?ASP。我們的示例Web UI的網絡MVC

?ASP。Net WebAPI封裝了我們的示例解決方案的緩存存儲。

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

技術分享

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

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

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

?TransDB OLTP數據庫,忙著處理事務。

?Cacher代理數據庫執行Python腳本執行腳本執行啟用“啟用外部腳本”選項打開。指的是微軟。Doc:外部腳本支持服務器配置選項。

?服務代理,SQL server的可靠的消息傳遞框架,艾滋病橋Cacher-Agent TransDB。通過緩存代理接收消息可以處理以更新緩存。

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

解決方案的架構

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

先決條件

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

1 .工作CacheDB托管的SQL實例必須安裝有Python的機器學習服務

二。要在CacheDB中執行帶有TSQL的Python腳本,應該運行SQL服務MSSQLLaunchpad或SQL Server Launchpad。參考微軟。Net:微軟機器學習服務

3 .項目啟用SP_Configure的外部腳本執行,請參考微軟。Doc:外部腳本支持服務器配置選項

sp_configure ‘外部腳本啟用‘,1;重新配置;

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

5。TransDB和Cacher數據庫應該啟用代理。參考微軟。Technet:如何:在數據庫中激活服務代理消息傳遞

6.1234 ALTER DATABASE TransDB SET ENABLE_BROKER;GO ALTER DATABASE CacheDB SET ENABLE_BROKER;去

。網絡應用

WebApplication有兩個主要的MVC操作;使用HTTP謂詞POST更新TransDB中的新實體,以及用HTTP謂詞返回從緩存返回產品類型列表的另一個操作。

技術分享

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

技術分享

對於我們的示例解決方案,這兩個應用程序都駐留在IIS下的單獨應用程序池標識中,以保證應用程序安全。但是對於實際的系統實現,托管環境可以是一個局域網或internet環境中的一個單獨的web服務器。

技術分享

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

技術分享

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

abc\ WebApp_SVC用戶使用具有授權規則模式的web應用程序,以允許訪問RESTful。緩存應用程序。

SQL數據庫和服務代理

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

對於我們的目的,過程UpdateProductType更新ProductType表與新記錄和AcknowledgeProductTypeCache過程的激活過程是CacheIntegration隊列,它接收來自目標確認處理消息時,即從Cacher數據庫。它還處理異常,並在CacheIntegrationError表中記錄這些異常。

更多關於服務經紀人的信息可以在微軟找到。DOC:SQL Server Service Broker

技術分享

技術分享

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

為了消除增加事務處理時間的任何機會,以及避免事務數據庫中其余數據的安全風險,我們將使用一個名為Cacher數據庫的代理數據庫在我們的示例解決方案中分離緩存更新過程。服務代理消息傳遞基礎設施將有助於連接TransDB和Cacher數據庫,基於事件的消息處理將使我們能夠更新駐留在基於網絡的系統上的緩存存儲。當更新消息到達時,Cacher數據庫扮演代理的角色,以執行緩存刷新。它通過執行Python腳本更新緩存。

隱藏自己的數據庫有:

1 .工作CacheLog和CacheIntegrationError表,跟蹤緩存刷新時的記錄,並記錄緩存刷新過程中可能出現的任何錯誤。

二。PerformCacheUpdate過程通過服務代理接收來自TransDB的傳入消息。如果消息的類型是UpdateMessage,那麽它將執行另一個過程UpdateWebCache,它執行Python腳本執行。

aUpdateWebCache過程的執行結果被保存在一個表變量中,然後在消息會話結束時插入到CacheLog表中。

b。當接收到的消息有錯誤或結束消息類型,並且在錯誤類型上,在CacheIntegrationError表中寫入異常日誌時,該過程也會結束對話。

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實例服務帳戶[identity]的SQL代碼。

1234改變授權端點:ServiceBrokerEndpoint[abc \ TransDB_SVC]去格蘭特在端點連接::ServiceBrokerEndpoint[abc \ TransDB_SVC]去

類似地,這裏是授權和授予端點連接到在TransDB數據庫的SQL實例中的Cacher的SQL實例服務帳戶[identity]的代碼。

1234改變授權端點:ServiceBrokerEndpoint[abc \ CacherAgent_SVC]去格蘭特在端點連接::ServiceBrokerEndpoint[abc \ CacherAgent_SVC]去

Python腳本

這裏是Python腳本文本,作為TSQL變量@ updatecache中的字符串保存。它有一個帶有邏輯的UpdateCache方法,可以執行一個HTTP POST調用rest。通過傳遞一個具有名稱和Id字段的數據對象來緩存,該數據對象作為輸入參數接收。它接收一個JSON對象並將其作為輸出結果返回給調用者。

在腳本的末尾,返回的對象被轉換為一個數組,因此它可以被構造成一個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中導入它們。

二。CPT的MS SQL版本,導入語句只能導入包範圍內放置的地方,因此我們可以註意,導入請求導入語句存在內部方法UpdateCache,導入語句導入大熊貓存在在腳本的最後一行的腳本。

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

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

5。最後一行程序dbo。使用結果集(作為dbo . updatecachelog)的UpdateWebCache;有一個用戶定義的表類型dbo。UpdateCacheLog,它有助於保持底層列的順序,避免在從接收的數據結構生成結果集的過程中出現任何不匹配。另一種方法是在Python內和結果集中構建一個映射的列結構。

數據庫安全

TransDB是一個OLTP數據庫,我們不希望任何對系統的攻擊有任何安全漏洞,因此在我們的示例解決方案方法中,這樣的數據庫可以托管在沒有安裝“機器學習服務”的SQL實例上。Cacher是一個能夠到達基於網絡的系統的代理,因此可以停留在安裝機器學習服務的SQL實例上。這兩個SQL實例都可以有一個單獨的服務帳戶標識,它被授權僅為一個特定的端口連接到服務代理端點。另一種安全認證通信的方法是使用證書。對於服務代理端點授權,請參考微軟。Technet:如何:允許使用證書(transact - sql)提供服務代理網絡訪問。

所有組件放在一起

在將所有組件放置就緒後,下面是我們的web應用程序,它允許我們創建一個新的ProductType,並使用RESTful HTTP調用從刷新緩存中列出相同的產品類型。在墻的後面有管理數據和緩存的組件在前端應用程序是看不見的。

技術分享

結論

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

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

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

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

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

?啟用了最小監控功能;緩存日誌和異常日誌,可以進一步增強以構建管理控制臺。

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

?通過使用服務代理消息傳遞機制,將外部系統觸發到專用數據庫中,這有助於獲取OLTP數據庫的事務和數據。

此項目的源代碼在githib中可用。

翻譯:Python和SQL Server 2017的強大功能