Python和SQL Server 2017的力量
Python和SQL Server 2017的力量
Python是新的SQL Server 2017。它主要的目的是允许使用面向机器学习在SQL Server中,但它可以用于远远超过这一点,与任何Python库或框架。提供一个例子,什么是可能的,Hitendra展示了如何使用该功能安全提供智能应用程序缓存,在SQL Server可以自动显示数据更改时触发一个缓存刷新。
MS SQL Server 2017增加了其先进的分析扩展,现在被称为“机器学习服务”,通过启用SQL Server执行Python脚本内TSQL通过机器学习服务与Python。这基本上提供了一种方法,数据库程序员可以直接从Python和传递数据。这不是有限的有效性提供机器学习数据分析的功能,因为Python有许多随时可用的模块和框架来解决许多问题,如执行大量计算与数据结构、图形处理进行分析,网络操作、数据库操作、网络操作或本地/基于网络文件系统操作。显然,这些最好是在中间件,但在数据库系统中,有些时候它更方便直接沟通到外部系统,而不是依靠外部流程执行任务通过轮询数据来源。这个有意义的时候不是这样的一个问题有一个解决方案在数据库或数据层,当它不提供任何安全问题。
在这里,我们将尝试演示的一个例子使用高级分析内的Python扩展,显示数据库可以触发外部进程执行一个活动的数据作为参数提供。这是为了考虑到安全的问题,数据可靠性和事务响应时间。
用例为Python
一些任务可以做更容易通过调用一个Python脚本从SQL而不是依靠中间件。这是特别的情况中的任务是由一个事件数据库。任务可能包括
- 发送数据,或接收从基于网络的系统TCP / HTTP / SOAP。
- 利用当地的平台资源,比如文件系统、网络或GPU。
- 构建实��集成在一个或多个系统之间通过使用一个通用的数据格式如JSON、XML或YAML。
- 与外部应用程序生成的数据或文件的沟通。
自然,也有一些潜在的缺点
- 如果您使用Python需要上网,有可能数据必须保持安全可能是不小心在互联网上共享。任何互联网接入必须仔细的监管网络。
- 安全风险暴露通过允许执行Python脚本在服务器上通过“外部脚本执行启用”。
- 资源密集型的Python脚本在同一台服务器上可以影响交易正在进行的大型OLTP系统的性能。
权衡这些优点和缺点,似乎仍有次当Python可以发挥有益的作用,如果它可以最小化风险。作为一个例子,让我们考虑如何使用Python来构建一个应用程序使用的数据缓存系统层。
示例解决方案缓存
缓存的数据可以提高应用程序性能的有效途径。缓存的存储开销成本,我们可以使有用的性能收益当面对诸如健谈与数据库、网络通信和高资源消耗由数据库当面对重复查询。当我们建立一个缓存基础设施时,我们面临的共同问题何时刷新缓存的内容。我们倾向于采用简单的解决方案在一定时间间隔后重建缓存。然而,这是非常低效的。最好是刷新缓存数据更改时,和只刷新是什么发生了改变。我们可以接近实时数据时在创建、更新或删除。有许多可用的工具和框架来解决刷新的问题,但是他们遭受的问题如何确定中发生更改的数据和修改之后提交。数据库是最有能够做到这一点。
对于我们的缓存系统,可用的来源吗,我们将限制微软堆栈的一切除了Python本身。
- Microsoft SQL Server 2017(CPT)
- 服务代理来隔离事务数据库。
- Python可执行脚本更新缓存通过HTTP(Python 3.5可执行库从蟒蛇分布)
- 。4.5.2净
- ASP。净MVC示例Web UI
- ASP。净WebAPI封装缓存存储我们的示例解决方案。
这是我们的示例解决方案缓存系统的图示:
WebApplication提供了一个用户界面来读取和更新数据。
- RESTful.Cache应用程序在我们的例子中缓存存储解决方案是用ASP。净WebAPI2,其内容类型JSON。http - get操作提供本地缓存的数据(一个静态的集合)。
- MS SQL Server 2017(CPT)是一个数据库服务器
- TransDBOLTP数据库,忙着处理事务。
- 隐藏自己代理执行Python脚本执行数据库,使用外部脚本启用的选项启用脚本执行。指的是微软。道格:外部脚本启用服务器配置选项.
- 服务代理SQL server的可靠的消息传递框架,艾滋病桥Cacher-Agent TransDB。接收到的消息处理Cacher-Agent更新缓存。
- Python是集成脚本语言和SQL 2017数据库系统(CPT)。
解决方案的架构
在我们的解决方案,我们将缓存实体产品类型名称的RESTful。缓存应用程序和WebApplication将有一个函数来创建新的产品类型条目从RESTful.Cache和阅读。
先决条件
另外,有一些先决条件和一些我们需要考虑的更多信息。
- SQL实例CacheDB在哪里举办必须安装“机器学习”技术服务与Python
- 执行一个Python脚本CacheDB TSQL,SQL服务MSSQLLaunchpad或SQL Server发射台应该运行。指微软。净:微软机器学习服务
- 使外部脚本执行SP_Configure,请参考微软。道格:外部脚本启用服务器配置选项
|
sp_configure “外部脚本启用”, 1; 重新配置; |
- TransDB和Cacher承载环境应该有一个服务代理端点上创建它的实例,如果这些是独立托管在两个不同的SQL实例然后每个实例都应该有自己的端点。
- TransDB和Cacher数据库应该启用代理。指微软。技术:如何激活服务代理消息传递在数据库中
|
改变 数据库 TransDB 集 ENABLE_BROKER; Go 改变 数据库 CacheDB 集 ENABLE_BROKER; Go |
网络应用
WebApplication有两个主要的MVC行动;一个更新一个新的实体TransDB HTTP动词POST和另一个动作从缓存中返回产品列表类型与HTTP动词。
RESTful。缓存有两种操作方法,一个更新缓存与新增实体产品类型与HTTP动词,和另一个本地缓存的所有缓存的产品类型。
对于我们的示例解决方案,两个应用程序驻留在IIS在单个应用程序池标识保持应用程序了。但对于实际系统的实现,可以个人网络服务器托管环境在内部网或互联网环境。
RESTful。缓存授权规则只有两个服务帐户处理HTTP请求。
abc \ WebApp_SVC和abc \ CacherAgent_SVC。abc \ CacherAgent_SVC服务帐户允许Python脚本在SQL的应用程序通过HTTP来刷新缓存。
WebApplication的abc \ WebApp_SVC用户在授权规则允许访问RESTful的方式。缓存应用程序。
SQL数据库和服务代理
OLTP数据库TransDB有几个对象,包括表、存储过程和服务代理对象。
对于我们的目的,过程UpdateProductType更新ProductType表与新记录和AcknowledgeProductTypeCache过程的激活过程是CacheIntegration队列,它接收来自目标确认处理消息时,即从Cacher数据库。它还处理异常,这些在CacheIntegrationError表和日志。
在服务代理可以找到更多的信息微软。道格:SQL Server服务代理
对于我们的示例解决方案,TransDB源数据库,创建更新缓存消息创建一个新的ProductType记录时,一个消息来执行一个动作,它有UpdateMessage消息类型,CacheIntegration合同与CacheSource服务发送消息到目标数据库。使用的服务有一个CacheQueue服务代理组件执行可靠的消息传递。ToCacheTarget路线已经将消息传递到目标的信息。
消除任何的机会增加事务处理时间以及避免任何安全风险在事务数据库中的数据的其余部分,我们将解耦缓存更新过程通过使用一个代理数据库,称为隐藏自己在我们的示例数据库解决方案。服务代理消息传递基础结构将有助于TransDB和Cacher数据库和连接,基于事件的消息处理将使我们更新缓存存储驻留在网络系统。Cacher数据库扮演一个代理的角色为了执行缓存刷新当更新消息的到来。它更新缓存通过执行一个Python脚本. .
隐藏自己的数据库有:
- CacheLog和CacheIntegrationError表,跟踪当缓存刷新和记录在缓存刷新过程中可能发生的任何错误。
- PerformCacheUpdate过程通过服务代理从TransDB接收传入的消息。如果消息的类型是UpdateMessage那么它执行另一个程序,UpdateWebCache,执行Python脚本的执行。
- UpdateWebCache程序的执行结果保存在一个表变量,然后年底CacheLog表中插入消息对话。
- 过程也结束了谈话当收到消息有错误或结束消息类型,错误类型,异常日志写在CacheIntegrationError表。
- UpdateWebCache过程提取从传入的XML消息Id和名称作为参数传递和Python脚本中嵌入这些值文本。脚本执行的结果集是一个结构化UpddateCacheLog类型表。
隐藏自己的服务代理对象,主要UpdateMessage消息类型和CacheIntegration TransDB合同一样,CacheQueue激活过程称为PerfomCacheUpdate,服务称为CacheTarget,路线TransDB信息的服务CacheService和端点地址。
对于我们的示例解决方案,最大队列读者对队列的数据库设置为1。这可以增加如果需要,例如,如果数据修改是高,你需要增加缓存刷新频率。
服务代理端点
我们的解决方案,数据库驻留在相同的实例,所以都是使用相同的服务代理端点来发送和接收消息。
但是如果我们想在个人主机数据库实例然后每个SQL实例的服务帐户应该有一个服务代理端点。和SQL实例应该许可允许将消息发送给对方的端点。连接的授权和批准可以用以下组TSQL命令。注意,在消息传递基础结构另一边有一个发送方和接收方,如前所述,如果SQL实例发送方和接收方的一部分,那么每个实例都应该有自己的进程标识。下图表示的每个SQL服务器运行在自己的身份。
这是SQL代码的授权和批准端点连接到TransDB SQL实例服务帐户(身份)在SQL Cacher数据库的实例。
|
改变 授权 在 端点::ServiceBrokerEndpoint 来 [美国广播公司\TransDB_SVC] Go 格兰特 连接 在 端点::ServiceBrokerEndpoint 来 [美国广播公司\TransDB_SVC] Go |
同样,这是授权和批准端点连接的代码隐藏自己的SQL实例服务帐户(身份)在SQL TransDB数据库的实例。
|
改变 授权 在 端点::ServiceBrokerEndpoint 来 [美国广播公司\CacherAgent_SVC] Go 格兰特 连接 在 端点::ServiceBrokerEndpoint 来 [美国广播公司\CacherAgent_SVC] Go |
Python脚本
这是Python脚本文本,@UpdateCache TSQL保存为字符串变量。它有UpdateCache方法与逻辑执行HTTP POST调用RESTful。缓存通过一个数据对象名称和Id字段,收到作为输入参数。接收JSON对象并将其作为输出结果的方法返回给调用者。
在脚本结束时,返回的对象转换成一个数组,所以它可以作为一个SQL结构化的结果。
|
声明 @UpdateCache NVARCHAR(马克斯) = N' 熊猫作为患产后抑郁症的#导入数据结构方案 def UpdateCache(名称、id): 导入作为HTTP # HTTP请求包的请求 #演奏HTTP POST,更新缓存 httpRequest = HTTP。文章(http://localhost/RESTful。缓存/ ProductType / UpdateCache,{名称:名称、Id:Id }) cacheLog = httpRequest.json() 返回cacheLog #更新缓存和构建日志元素 日志=[UpdateCache('+ @的名字+' ,'+ 投(@Id 作为 VARCHAR(10)) +')] #返回数据帧即从SQL表结构 OutputDataSet = PND.DataFrame(数据=日志) '; |
有几件事值得注意的是,使用SQL server的Python脚本。
- 我们可以编写一个脚本或连续成方法我们做了在这个解决方案中。另外,我们可以创建内联类或创建一个包和进口在python PIP命令在命令提示符。
- CPT的MS SQL版本,导入语句只能导入包范围内放置的地方,因此我们可以注意,导入请求导入语句存在内部方法UpdateCache,导入语句导入大熊猫存在在脚本的最后一行的脚本。
- 输出对象的方法UpdateCache立即转换为一个数组,熊猫。DataFrame能够将对象转换为一个SQL server数据结构可以很容易地理解作为一个表行和列。
- 分配给OutputDataSet对象的数据结构可用TSQL执行上下文的SQL服务器。
- dbo的最后一行程序。UpdateWebCache,结果集(dbo.UpdateCacheLog类型);有一个用户定义的表dbo类型。UpdateCacheLog有助于保持底层列在秩序和避免任何不匹配过程中生成的结果集接收的数据结构。另一种方法是建立一个映射列结构中的Python和结果集。
数据库安全
TransDB OLTP数据库,我们不希望任何安全漏洞的攻击系统,因此我们的示例解决方案的方法,这样可以托管在一个SQL数据库实例,没有安装机器学习服务。隐藏自己是一个代理,能够达到一个基于网络的系统,所以可以在SQL实例安装机器学习服务。SQL实例可以有个人服务帐户的身份,已授权服务代理端点连接仅供特定端口。另一种安全通信是通过使用证书进行认证。授权服务代理端点引用微软。技术:如何:允许服务代理网络访问使用证书(transact - sql)为更多的细节。
所有组件放在一起
把所有的组件,这是我们WebApplication允许我们创建一个新的ProductType和列表相同的产品类型与RESTful HTTP调用刷新缓存。后面墙上有组件的管理数据和缓存是无形的前端应用程序。
结论
应用,如电子商务、医疗电子政务可以受益于一个好的缓存实现。通过扩展的使用技术,我们都很熟悉,我们可以得到一个解决方案,是易于维护的成本没有学习一个新的框架或特性。
满足我们需要的,因为我们的示例解决方案
- 当数据被创建或修改一个OLTP事务,系统刷新网络缓存系统进行读访问。
- 它可以使用异步事件刷新缓存,接近实时的。这不会影响原来的事务的性能。
- 它可以画一个安全事务之间的界限,通过HTTP缓存系统,保证数据安全的OLTP数据库。
- 它与最小启用监测功能;缓存日志和异常日志,可以增强进一步建立一个管理控制台。
- 与服务代理消息传递组件,解决方案是足够灵活来触发或到达网络系统异步消息处理时发生。换句话说,与SQL数据库集成服务代理信息和基于接收的数据,执行一个动作来获取或发送数据到外部系统数据层之外。
- 隔离,外部系统触发事件内部专用的数据库使用消息传递服务代理,有助于安全事务和OLTP数据库的数据。
这个项目的源代码在githib可用。https://github.com/hi10p/SQL17Python
原文链接:
https://www.red-gate.com/simple-talk/sql/sql-development/power-python-sql-server-2017/