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