#Caché

1 关注者 · 982 帖子

  

InterSystems Caché 是一个多模型 DBMS 和应用服务器。

查看此处提供的更多详细信息

文档

文章 姚 鑫 · 八月 2, 2022 3m read

第十五章 源代码文件 REST API 简介

源代码文件 REST API 简介

REST API 提供对源代码文件的访问。我们开发此 API 是为了允许 Atelier(我们基于 EclipseIDE)访问 IRIS 服务器上的 IRIS 代码文件。可以使用 API 执行访问 IRIS 代码文件所需的操作。这些行动包括:

  • 获取 IRIS 实例上可用的命名空间
  • 查找命名空间中定义的类定义和例程
  • 获取类和例程的文本定义
  • 更新类定义或例程
  • 创建新的类定义或例程
  • 删除类定义或例程
  • 编译 IRIS 类或例程
  • 通过对表执行 SQL 查询来发现 IRIS 环境的属性

这些操作提供了访问 IRIS 源代码文件的机制。为了创建 IRIS 开发环境,应该了解此 API 并全面了解 IRIS 源代码文件如何在 IRIS 中使用。

这是一个特殊用途的 API。如果正在创建开发环境或处理类似的应用程序,例如类浏览器,可能会发现此 API 很有用。但是,它不是用于访问 IRIS 对象的通用 REST API

本文档描述了 IRIS 源代码文件 REST API 的版本 12IRIS 的未来版本可能支持此 REST API 的更高版本,提供额外的调用,但将始终能够调用早期版本。版本 1APIURL 中包含 /v1/,版本 2API 包含 /v2/。可以通过调用 GetServ

0
0 120
文章 姚 鑫 · 八月 1, 2022 4m read

第十四章 手动创建 REST 服务(二)

指定数据格式

可以定义 REST 服务以处理不同格式的数据,例如 JSONXML、文本或 CSVREST 调用可以通过在 HTTP 请求中指定 ContentType 元素来指定它期望发送的数据的形式,并且可以通过在 HTTP 请求中指定 Accept 元素来请求返回数据格式。

DocServer 示例中,GetNamespaces() 方法检查 REST 调用是否使用以下内容请求 JSON 数据:

If $Get(%request.CgiEnvs("HTTP_ACCEPT"))="application/json"

本地化 REST 服务

REST 服务返回的任何字符串值都可以本地化,以便服务器以不同语言存储多个版本的字符串。然后,当服务接收到包含 HTTPAccept-Language 标头的 HTTP 请求时,服务会使用相应版本的字符串进行响应。

本地化 REST 服务:

  1. 在实现代码中,不要包含硬编码的文字字符串,而是使用 $$$Text 宏的实例,为宏参数提供如下值:
  • 默认字符串
  • (可选)该字符串所属的域(将字符串分组到域中时,本地化更易于管理)
  • (可选)默认字符串的语言代码

例如,而不是这个:

 set returnvalue="Hello world"
 set returnvalue=$$$TEXT("Hello
0
0 84
文章 姚 鑫 · 七月 31, 2022 8m read

第十三章 手动创建 REST 服务(一)

本附录描述了如何通过继承 %CSP.REST 类来手动创建 REST 服务;此过程创建了一个手动编码的 REST 服务,它不能与所有 API 管理工具一起使用。

手动创建 REST 服务的基础知识

要手动定义 REST 服务,请执行以下操作:

  • 创建一个 REST 服务类 — %CSP.REST 的子类。在子类中:
    • 定义一个 URL 映射,该映射指定为 REST URLHTTP 方法执行的 IRIS 方法。
    • 可以选择指定 UseSession 参数。此参数控制每个 REST 调用是在其自己的 Web 会话下执行还是与其他 REST 调用共享一个会话。
    • (可选)覆盖错误处理方法。

如果想将实现代码与调度代码分开,可以在单独的类中定义实现 REST 服务的方法,并从 URL 映射中调用这些方法。

  • 定义一个使用 REST 服务类作为其调度类的 Web 应用程序。

要定义 Web 应用程序及其安全性,请转至 Web 应用程序页面(单击System Administration > Security > Applications > Web Applications)。

定义 Web 应用程序时,将 Dispatch Class 设置为 REST 服务类的名称。

此外,将应用程序的名称指定为 REST 调用的 URL 的第一部分。示例名称为 /cs

0
0 108
文章 姚 鑫 · 七月 30, 2022 3m read

第十二章 使用中的 OpenAPI 属性

本附录列出了 API 管理工具在生成 REST 服务类时使用的 OpenAPI 2.0 规范的属性。此处未列出的属性将被忽略。有几个扩展属性;它们的名称以 x-ISC 开头。

Swagger

  • basePath

  • consumes

  • host

  • produces

  • definitions (请注意,API 管理工具在生成代码时不使用 Schema 对象的任何属性)

  • parameters (for details, see “Parameter Object”)

  • paths (for details, see “Path Item Object”)

  • info (for details, see “Info Object”)

  • swagger (must be "2.0")

有关这些属性的详细信息,请参阅 https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#swagger-object

Info Object

  • title

  • description

  • x-ISC_RequiredResource (访问 REST 服务的任何端点所需的已定义资源及其访问模式 (resource:mode) 的逗号分隔列表)

  • version

0
0 186
文章 姚 鑫 · 七月 29, 2022 2m read

第十一章 /api/mgmnt/ API 参考

此参考列出了 /api/mgmnt/ 服务中的端点,所有这些端点都适用于较新的 REST 服务。下表总结了端点并指出它们是否也适用于手动编码的 REST 服务。

EndpointSummaryApplies to NEWER REST Services?Applies to Manually-Coded REST Services?
DELETE /api/mgmnt/v2/:ns/:app删除 REST 服务YESno
GET /api/mgmnt/列出此服务器上启用 RESTWeb 应用程序YESYES
GET /api/mgmnt/v1/:ns/restapps列出命名空间中启用 RESTWeb 应用程序YESYES
GET /api/mgmnt/v1/:ns/spec/:app返回 REST 服务的 OpenAPI 2.0 规范noYES
GET /api/mgmnt/v2/列出此服务器上的 REST 服务(包括任何没有关联 Web 应用程序的服务)YESno
GET /api/mgmnt/v2/:ns列出命名空间中的 REST 服务(包括任何没有关联 Web 应用程序的服务)YESno
GET /api/mgmnt/v2/:ns/:app
0
0 76
文章 姚 鑫 · 七月 28, 2022 4m read

第十章 发现和记录 REST API

本章讨论如何发现实例上可用的 REST 服务以及如何为 REST 服务生成文档。

使用 /api/mgmnt 服务发现 REST 服务

/api/mgmnt 服务包括可用于发现 REST 服务类和启用 RESTWeb 应用程序的调用。

发现 REST 服务

要使用 /api/mgmnt 服务来发现实例上可用的 REST 服务,请使用以下 REST 调用:

  • 对于 HTTP 操作,选择或指定 GET
  • 对于 URL,请指定以下形式的 URL
http://localhost:52773/api/mgmnt/v2/

或者,如果只想检查一个命名空间:

http://localhost:52773/api/mgmnt/v2/:namespace

其中 localhost 是服务器的名称,52773 是运行 IRISWeb 服务器端口,命名空间是要检查的命名空间。

(请注意,这些调用会忽略手动编码的 REST 服务。要发现手动编码的 REST 应用程序,请使用调用 GET /api/mgmnt/GET /api/mgmnt/:v1/:namespace/restapps。)

如果调用成功,IRISJSON 格式返回一个列出 REST 服务的数组。例如:

[
  {
    "name": "%Api.Mgmnt.v2",
0
0 136
文章 姚 鑫 · 七月 27, 2022 3m read

第九章 REST 服务安全

如果 REST 服务正在访问机密数据,应该对服务使用身份验证。如果需要为不同的用户提供不同级别的访问权限,还要指定端点所需的权限。

REST 服务设置身份验证

可以对 IRIS REST 服务使用以下任何形式的身份验证:

  • HTTP 身份验证标头 — 这是 REST 服务的推荐身份验证形式。
  • Web 会话身份验证 — 其中用户名和密码在 URL 中的问号后面指定。
  • OAuth 2.0 身份验证 - 请参阅以下小节。

REST 应用程序和 OAuth 2.0

要通过 OAuth 2.0REST 应用程序进行身份验证,请执行以下所有操作:

  • 将包含 REST 应用程序的资源服务器配置为 OAuth 2.0 资源服务器。
  • 允许对 %Service.CSP 进行委派身份验证。
  • 确保将 Web 应用程序(用于 REST 应用程序)配置为使用委托身份验证。
  • %SYS 命名空间中创建一个名为 ZAUTHENTICATE 的例程。 提供了一个示例例程 REST.ZAUTHENTICATE.mac,可以复制和修改它。此例程是 GitHub (https://github.com/intersystems/Samples-Security) 上 Samples-Security 示例的一部分。可以按照“下载用于 IRIS 的示例”中的说明下载整个示例,但在 GitHub
0
0 120
文章 姚 鑫 · 七月 25, 2022 6m read

第七章 在 REST 服务中支持 CORS

概述

本节提供 CORS 的概述以及如何在 IRIS REST 服务中启用 CORS 的概述。

CORS 简介

跨域资源共享 (CORS) 允许在另一个域中运行的脚本访问服务。

通常,当浏览器从一个域运行脚本时,它允许对同一个域进行 XMLHttpRequest 调用,但在对另一个域进行调用时不允许它们。此浏览器行为限制某人创建可滥用机密数据的恶意脚本。恶意脚本可能允许用户使用授予用户的权限访问另一个域中的信息,但随后在用户不知道的情况下,将机密信息用于其他用途。为了避免这种安全问题,浏览器一般不允许这种跨域调用。

在不使用跨域资源共享 (CORS) 的情况下,具有访问 REST 服务的脚本的网页通常必须与提供 REST 服务的服务器位于同一域中。在某些环境中,将带有脚本的网页与提供 REST 服务的服务器放在不同的域中是很有用的。 CORS 支持这种安排。

下面提供了浏览器如何使用 CORS 处理 XMLHttpRequest 的简化描述:

  1. DomOne 中的网页中的脚本包含对 DomTwo 域中的IRIS REST 服务的 XMLHttpRequestXMLHttpRequest 具有 CORS 的自定义标头。
  2. 用户查看此网页并运行脚本。用户的浏览器检测到与包含网页的域不同的域的 XMLHttpRequest
  3. 用户的浏览器向 IRIS
0
0 119
文章 姚 鑫 · 七月 24, 2022 2m read

第六章 修改规范(SPEC)类

概述

下表列出了修改规范类的原因并简要总结了所需的更改:

原因改变
更新或替换规范手动修改 OpenAPI XData 块或通过重新生成规范类。
启用 REST 服务以支持 CORS手动修改 OpenAPI XData 块;还添加一个类参数并创建一个自定义调度超类。
启用 REST 服务以支持 Web 会话添加类参数。
指定使用端点所需的权限手动修改 OpenAPI XData 块。
覆盖默认内容类型、响应字符集或输入流处理添加类参数。
为服务方法指定一个非默认名称手动修改 OpenAPI XData 块。

无论何时编译规范类,编译器都会在同一个包中重新生成调度类并更新实现类。

覆盖内容类型、响应字符集或输入流处理

只需将类参数添加到规范类并重新编译,就可以覆盖 REST 服务的几个关键方面。

  • 默认情况下,REST 服务需要 application/json 内容类型。要覆盖它,请将以下内容添加到规范类:
Parameter CONTENTTYPE = "some-content-type";

其中 some-content-typeMIME 内容类型。

  • 默认情况下,REST 服务的响应消息采用 UTF-8 格式。要覆盖它,请将以下内容添加到规范类:
Parameter CHARSET =
0
0 140
文章 姚 鑫 · 七月 23, 2022 2m read

第五章 修改实现(IMPL)类

本章讨论如何修改 REST 服务的实现类。

初始方法定义

实现类最初包含存根方法,如下例所示:

/// Returns all pets from the system that the user has access to<br/>
/// The method arguments hold values for:<br/>
///     tags, tags to filter by<br/>
///     limit, maximum number of results to return<br/>
ClassMethod findPets(tags As %ListOfDataTypes(ELEMENTTYPE="%String"), limit As %Integer) As %Stream.Object
{
    //(Place business logic here)
    //Do ..%SetStatusCode(<HTTP_status_code>)
    //Do ..%SetHeader(<name>,<value>)
    //Quit (Place response here) ; response may be a string, stream or dynamic object
}

在每种情况下,这些存根方法都具

0
0 135
文章 姚 鑫 · 七月 22, 2022 3m read

第四章 使用 %REST.API 类创建 REST 服务

本章介绍如何使用 %REST.API 类来创建、更新和删除 REST 服务。

使用 %REST.API 类创建或更新 REST 服务

创建 REST 服务的推荐方法是从 REST 服务的 OpenAPI 2.0 规范开始,并使用它来生成 REST 服务类。要使用 %REST.API 类执行此操作:

  1. 获取 REST 服务的 OpenAPI 2.0 规范,采用 JSON 格式,并将规范保存为文件。该文件必须是 UTF-8 编码的。
  2. 在要定义 REST 服务的命名空间中,使用该文件创建 %DynamicObject 的实例。
  3. 然后调用 %REST.API 类的 CreateApplication() 方法。此方法具有以下签名:
classmethod CreateApplication(applicationName As %String, 
                              swagger As %DynamicObject = "", 
                              ByRef features, 
                              Output newApplication As %Boolean,
0
0 145
文章 姚 鑫 · 七月 21, 2022 3m read

第三章 使用 ^%REST 例程创建 REST 服务

本章介绍如何使用 ^%REST 例程创建和删除 REST 服务。

提示:还可以使用此例程更新REST服务;只需删除REST服务,然后重新创建它。

使用^%REST例程

^%REST例程是一个简单的命令行界面。在任何提示下,可以输入以下答案:

  • ^ - 使例程跳回上一个问题。
  • ? - 使例程显示一条列出所有当前选项的消息。
  • qquit - 结束例程。

此外,每个问题都会在括号中显示该问题的默认答案。

使用^%REST例程创建REST服务

创建REST服务的推荐方法是从REST服务的OpenAPI2.0规范开始,并使用该规范生成REST服务类。要使用^%REST例程执行此操作:

  1. 获取JSON格式的REST服务的OpenAPI 2.0规范。将规范另存为文件或记下可访问规范的URL。
  2. 在终端中,更改到要在其中定义REST服务的名称空间。
  3. 输入以下命令以启动^%REST例程:
do ^%REST
  1. 在第一个提示符处,输入 REST 服务的名称。该名称用作生成类的包名;使用有效的包名。如果想使用名称列表、lquitq(在任何情况下都是变体),请将名称用双引号括起来。例如:"list"
  2. 在下一个提示符处,输入 Y(不区分大小写)以确认您要创建此服务。

然后,该例程会提示输入要使用的 OpenAPI 2.0 规范的位置。输入完整路径名或 URL

0
0 97
文章 姚 鑫 · 七月 20, 2022 4m read

第二章 使用 /api/mgmnt/ 服务

本章介绍如何使用 /api/mgmnt 服务来创建、更新和删除 REST 服务。

/api/mgmnt 服务还提供了可用于发现和记录 Web 服务的选项,如本书后面所述。

使用 /api/mgmnt 服务创建 REST 服务

创建 REST 服务的推荐方法是为 REST 服务创建 OpenAPI 2.0(也称为 Swagger)描述,并使用它来生成 REST 服务类。如果您正在实现由第三方定义的 REST 服务,他们可能会提供此 OpenAPI 2.0 描述。有关 OpenAPI 2.0 描述格式的详细信息,请参阅 OpenAPI 2.0 规范。以下主题描述了如何使用 /api/mgmnt 服务来执行此操作。

使用 /api/mgmnt 服务生成类

第一步,生成 REST 服务类,如下所示:

  1. JSON 格式创建或获取 REST 服务的 OpenAPI 2.0 描述。
  2. 获取 REST 测试工具,例如 PostMan (https://www.getpostman.com/)。
  3. 在测试工具中,创建如下 HTTP 请求消息:
  • 对于 HTTP 操作,选择或指定 POST
  • 对于 URL,请指定以下形式的 URL

http://localhost:52773/api/mgmnt/v2/namespace/myapp

其中 localhost 是服务器的名

0
0 140
文章 姚 鑫 · 七月 19, 2022 8m read

第一章 创建 REST 服务简介

本文介绍 IRIS® 中的 RESTREST 服务。

REST 简介

REST 命名自“Representational State Transfer”,具有以下属性:

  • REST 是一种架构风格,而不是一种格式。尽管 REST 经常使用 HTTP 来传输消息并使用 JSON 来传递数据,但也可以将数据作为 XML 或纯文本传递。 REST 利用现有的 Web 标准,例如 HTTPURLXMLJSON
  • REST 是面向资源的。通常,资源由 URL 标识并使用基于 HTTP 方法的操作,例如 GETPOSTPUTDELETE
  • REST 通常有少量开销。虽然它可以使用 XML 来描述数据,但它更常用的是 JSON,它是一种轻量级的数据包装器。 JSON 使用标签标识数据,但标签没有在正式的模式定义中指定,也没有明确的数据类型。

REST 服务简介

IRIS 2019.2 及更高版本中定义 REST 接口有两种方法:

  • 规范优先定义——首先创建一个 OpenAPI 2.0 规范,然后使用 API 管理工具生成 REST 接口的代码。
  • 手动编码 REST 接口。

使用规范优先的定义,REST 服务正式由以下组件组成:

  • 规范类(%REST.Spec 的子类)。此类包含 REST 服务的 OpenAPI 2.0 规范。
0
0 136
问题 Michael Lei · 五月 5, 2021

大家好,

我想知道是否有可能获取自身的值来运行查询。

我想创建一些查询以在%Persistent类中找到一个值,但是每个查询都使用不同的值。

Class Kurro.MyClass Extends %Persistent
{

/// Key of process
Property KeyProcess As %String(MAXLEN = "");

/// Specialist
Property CodeSpecialist As %String;

/// Provider
Property CodeProvider As %String;

/// Center
Property CodeCenter As %String;

/// Date
Property Date As %TimeStamp;

/// IdList
Property IdList As %String;

/// IdProcess
Property IdProcess As %String;

/// Duration
Property Duration As %String;

Query GetInfo(pObject AS Kurro.MyClass) As %SQLQuery(CONTAINID = 1, ROWSPEC =
1
0 541
问题 Michael Lei · 五月 10, 2021

我想安装Windows版本的管理门户引擎来创建Cache InterSystems数据库
我想为Cache InterSystems创建一个样本数据库,并想通过Cache Entity Framework Provider访问它。但是,我无法找到一个特定的管理门户引擎来创建数据库。

你能指导一下如何在Windows中安装管理门户吗?

I want to install Management Portal Engine for Windows to create Cache InterSystems DB

I want to create a Sample Database for Cache InterSystems and want to access it via Cache Entity Framework Provider. But, I cannot find a particular engine of Management Portal to create a database. 

Can you guide how to install Management Portal in Windows?

2
0 231
问题 Michael Lei · 五月 10, 2021

大家好,

我需要根据用户请求删除Ensemble接口。我想为此编写一个程序,执行的时候将通过代码删除接口组件。
能否提供以下操作的代码示例?

  • 从规则类中删除单个规则
  • 从Ensemble删除一个类
  • 从生产环境中删除主机(服务/操作/流程)。

感谢帮助。
谢谢,

普鲁索他曼

Ensemble Delete Individual Rules and Ensemble classes programmatically
Hi Team,

I have a requirement to delete the Ensemble interfaces , as per User request. I would like to write a routine for that and once I execute, it should remove the interface components through code.
Could you please provide code samples for the following actions ?

Deleting an individual rule from a rule class
Deleting a class from Ensemble
Deleting a Host (Service/Operation/Process) from the

1
0 214
问题 Michael Lei · 五月 18, 2021

大家好,

我目前正在开发TCP入站服务,以读取从使用EnsLib.TCP.CountedOutboundAdapter的TCP操作发送的一些XML。

1)我尝试过EnsLib.TCP.Inbound适配器,但是会出现此错误:

错误<Ens> ErrException:<METHOD不存在> zinitConfig + 7 ^ Ens.Host.1 *%New,EnsLib.TCP.InboundAdapter-登录为'-'
数字 - @'
设置..Adapter = $ classmethod(..#ADAPTER,“%New”)'

因此,适配器无法开始侦听传入的连接。

2)当我改用EnsLib.TCP.CountedXMLInboundAdapter或EnsLib.TCP.CountedInboundAdapter时,适配器开始侦听给定的端口,但OnProcessinput()方法未在pInput流中接收任何数据。流始终为空,并在事件日志中引发此错误。

错误<Ens> ErrTCPReadBlockSize:超时时间为(5)的TCP Read(32000)失败,错误如下:(1144):l version =“ 1.0” encoding =“ UTF-8”?> Wsma2Message xmlns:ns1 =“ urn:hl7-org :v3“ ......

我尝试将读取超时时间一直更改为30秒,

1
0 240
问题 Michael Lei · 五月 18, 2021

我可以从AIX命令行提示符运行以下命令,而不会出现任何问题

-bash-2.05b$ echo t
t
-bash-2.05b$ echo œ
œ

当我从内部Cache调用时,我遇到了问题。

USER>D $ZF(-1,"echo t")
t

USER>D $ZF(-1,"echo œ")

D $ZF(-1,"echo œ")
^
<TRANSLATE>

我正在使用Cache 2017.2。有人可以帮忙吗?

谢谢你。

1
0 225
问题 Michael Lei · 四月 29, 2022

我想知道是否有更好的方法来使用动态SQL对数据集进行分页,而不是我下面使用的方法。问题是,当潜在的数据池变大时,这段代码就会变慢,以至于无法使用。在分析下面的每一行代码时,似乎速度变慢与最初的rset.%Next()迭代有关。 有没有什么不需要子查询/%VID的可用方法,比如简单的LIMIT/OFFSET?

我的代码类似于:

s sql=##class(%SQL.Statement).%New()

s query="SELECT *,%VID FROM (SELECT prop FROM table WHERE prop=x) WHERE %VID BETWEEN 1 AND 100"             

s sc=sql.%Prepare(query)

s rset=sql.%Execute()

while rset.%Next() {.....

1
1 562
文章 姚 鑫 · 七月 17, 2022 4m read

第八章 使用嵌入式 Python (五)

通过引用传递参数

ObjectScript 编写的方法中的参数可以通过值或引用传递。在下面的方法中,签名中第二个和第三个参数前面的 ByRef 关键字表示它们打算通过引用传递。

ClassMethod SandwichSwitch(bread As %String, ByRef filling1 As %String, ByRef filling2 As %String)
{
    set bread = "whole wheat"
    set filling1 = "almond butter"
    set filling2 = "cherry preserves"
}

ObjectScript 调用方法时,在参数前放置一个句点以通过引用传递它,如下所示:

USER>set arg1 = "white bread"
 
USER>set arg2 = "peanut butter"
 
USER>set arg3 = "grape jelly"
 
USER>do ##class(User.EmbeddedPython).SandwichSwitch(arg1, .arg2, .arg3)
 
USER>write arg1
white bread
USER>write arg2
almond butter
0
0 125
文章 姚 鑫 · 七月 16, 2022 4m read

第七章 使用嵌入式 Python (四)

弥合 ObjectScript 和嵌入式 Python 之间的差距

由于 ObjectScriptPython 语言之间的差异,将需要了解一些有助于弥合语言之间差距的信息。

ObjectScript 方面,%SYS.Python 类允许从 ObjectScript 使用 Python

Python 方面,iris 模块允许使用 Python 中的 ObjectScript。在 Python 中,键入 help(iris) 以获取其方法和函数的列表。

使用 Python 内置函数

builtins 包在 Python 解释器启动时自动加载,它包含语言的所有内置标识符,例如基对象类和所有内置数据类型类、异常类、函数和常量。

可以将此包导入 ObjectScript 以访问所有这些标识符,如下所示:

set builtins = ##class(%SYS.Python).Import("builtins")

Python print() 函数实际上是内置模块的一个方法,因此现在可以在 ObjectScript 中使用此函数:

USER>do builtins.print("hello world!")
hello world!

然后可以使用 zwrite 命令检查内置对象,因为它是一个 Python 对象,所以它使用内置包的 str() 方法来获取

0
0 152
文章 姚 鑫 · 七月 15, 2022 5m read

第六章 使用嵌入式 Python (三)

从 ObjectScript 调用嵌入式 Python 代码

使用 Python 库

嵌入式 Python 让可以轻松访问数以千计的有用库。通常称为“包”,它们需要从 Python 包索引 (PyPI) 安装到 <installdir>/mgr/python 目录中,然后才能使用。

例如,ReportLab Toolkit 是一个用于生成 PDF 和图形的开源库。以下命令使用软件包安装程序 irispipWindows 系统上安装 ReportLab

C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python reportlab

在基于 UNIX 的系统上,使用:

$ pip3 install --target /InterSystems/IRIS/mgr/python reportlab

安装包后,可以使用 %SYS.Python 类的 Import() 方法在 ObjectScript 代码中使用它。

给定一个文件位置,以下 ObjectScript 方法 CreateSamplePDF() 创建一个示例 PDF 文件并将其保存到该位置。

Class Demo.PDF
{

ClassMethod
0
0 204
文章 姚 鑫 · 七月 14, 2022 3m read

第五章 使用嵌入式 Python (二)

在 Python 脚本文件 (.py) 中

还可以使用 irispython 命令执行 Python 脚本。

考虑 Windows 系统上的文件 C:\python\test.py,其中包含以下代码:

# print the members of the Fibonacci series that are less than 10
print('Fibonacci series:')
a, b = 0, 1
while a < 10:
    print(a, end=' ')
    a, b = b, a + b

# import the iris module and show the classes in this namespace
import iris
print('\nInterSystems IRIS classes in this namespace:')
status = iris.cls('%SYSTEM.OBJ').ShowClasses()
print(status)

可以从命令行运行 test.py,如下所示:

C:\InterSystems\IRIS\bin>set IRISUSERNAME = <username>

C:\InterSystems\IRIS\bin>set IRISPASSWORD =
0
0 155
文章 姚 鑫 · 七月 13, 2022 3m read

第四章 使用嵌入式 Python (一)

嵌入式 Python 允许使用 Python 作为编程 IRIS 应用程序的本机选项。

预备知识

使用嵌入式 Python 所需的 Python 版本取决于运行的平台。

在 Microsoft Windows 上,IRIS 安装工具包安装正确版本的 Python(当前为 3.9.5),仅用于嵌入式 Python。如果在开发机器上并希望将 Python 用于一般用途,建议从 https://www.python.org/downloads/ 下载并安装相同的版本。

许多基于 UNIX 的操作系统都安装了 Python。如果需要安装,请使用包管理器为操作系统推荐的版本,例如:

  • macOS:使用 Homebrew 安装 Python 3.9(https://formulae.brew.sh/formula/python@3.9)
  • Ubuntu: apt-get install python3
  • Red Hat Enterprise Linux or Oracle Linux: yum install python3
  • SUSE: zypper install python3

如果收到“无法加载 python”的错误,这意味着没有安装 Python,或者系统上安装了意外版本的 Python。使用上述方法之一安装或重新安装。

在基于 UNIX 的系统上,可能希望使

0
0 290
文章 姚 鑫 · 七月 12, 2022 6m read

第三章 嵌入式Python概述(三)

使用 SQL

IRIS 中的类被投影到 SQL,除了使用类方法或直接全局访问之外,还允许使用查询访问数据。 iris 模块为提供了两种从 Python 运行 SQL 语句的不同方式。

以下示例使用 iris.sql.exec() 运行 SQL SELECT 语句以查找类名称以“%Net.LDAP”开头的所有类定义,返回一个包含每个名称和超类的结果集每个班级。在这里,系统类 %Dictionary.ClassDefinitionSQL 投影为同名表。

>>> rs = iris.sql.exec("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH '%Net.LDAP'")

以下示例使用 iris.sql.prepare() 准备 SQL 查询对象,然后执行查询,将“%Net.LDAP”作为参数传入:

>>> stmt = iris.sql.prepare("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH ?")
>>> rs = stmt.execute("%Net.LDAP")

无论哪种情况,都可以按如下方式遍历结果集,并且输出相同:

>>>
1
0 167
文章 姚 鑫 · 七月 11, 2022 4m read

第二章 嵌入式Python概述(二)

从 Python 调用 IRIS API

如果使用的是嵌入式 Python 并且需要与 IRIS 交互,可以使用 Python shell 中的 iris 模块,或者使用 Python 编写的 IRIS 类中的方法。要遵循本节中的示例,可以使用 ObjectScript 命令 do ##class(%SYS.Python).Shell() 从终端会话启动 Python shell

当启动终端会话时,将被放置在 IRISUSER 命名空间中,将看到提示 USER>。但是,如果从 GitHub 加载了示例类,则需要在 SAMPLES 命名空间中才能访问它们。

在终端中,更改为 SAMPLES 命名空间,然后启动 Python shell,如下所示:

USER>set $namespace = "SAMPLES"
SAMPLES>do ##class(%SYS.Python).Shell()

Python 3.9.5 (default, Jul 19 2021, 17:50:44) [MSC v.1927 64 bit (AMD64)] on win32
Type quit() or Ctrl-D to exit this shell.
>>>

当从终端会话启动 Python shell 时,Python shell 继承与终端相同的上下文,例如

0
0 144