#InterSystems IRIS

0 关注者 · 877 帖子

InterSystems IRIS 是一个完整的数据平台
InterSystems IRIS 为您提供了捕获、共享、理解组织最宝贵的资产(数据)并采取相应行动所需的一切。
作为一个完整的平台,InterSystems IRIS 不需要集成多种开发技术。应用程序需要更少的代码、更少的系统资源和更少的维护。

文章 Jeff Liu · 十一月 6, 2025 4m read

动机

直到开始新工作,我才了解到ObjectScript。实际上,Objectscript并不是一种年轻的编程语言。与 C++、Java 和 Python 相比,它的社区并不活跃,但我们很想让这里更有活力,不是吗?

我注意到,有些同事在理解大型项目中的类关系时感到棘手。目前还没有易于使用的现代化类图工具适用于ObjectScript。

相关工作

我尝试过相关的工作:

——InterSystems 类视图:
1. https://github.com/intersystems-community/ClassExplorer
这个工具很棒,类图显示清晰美观。但存在Docker构建问题:“#0 0.512 exec ./irissession.sh: no such file or directory”。我猜这是为Studio设计的支持功能,而非VSCode。它似乎需要手动导入项目,且需要一定配置才能使用。

2. https://github.com/gjsjohnmurray/vscode-objectscript-class-view
这是另一个给我带来灵感的伟大作品。类结构清晰,不仅支持项目中的类,也支持库中的类。但看起来像是VSCode大纲的增强版。

——其他语言的 VSCode 类图表视图插件

0
0 11
文章 Nicky Zhu · 十月 31, 2025 20m read

目录

  1. 本文目的
  2. 什么是容器,它们为什么对 IRIS 有意义
     2.1 容器和镜像简介
     2.2 为什么容器对开发者很有用
     2.3 为什么 IRIS 可以很好地与 Docker 配合使用
  3. 先决条件
  4. 安装 InterSystems IRIS 镜像
     4.1 使用 Docker Hub
     4.2 拉取镜像
  5. 运行 InterSystems IRIS 镜像
     5.1 启动 IRIS 容器
     5.2 检查容器状态
     5.3 在容器终端执行代码
     5.4 访问 IRIS 管理门户
     5.5 将容器连接到 VS Code
     5.6 停止或移除容器
     5.7 使用绑定挂载设置特定密码
     5.8 使用持久化 %SYS 卷
      5.8.1 可以使用持久化 %SYS 存储什么
      5.8.2 如何启用持久化 %SYS
  6. 使用 Docker Compose
     6.1 Docker Compose 示例
     6.2 运行 Docker Compose
  7. 使用 Dockerfile 运行自定义源代码
     7.1 Dockerfile 示例
     7.2 Docker Compose 示例
     7.3 了解层、镜像标记和构建与 运行时
     7.4 源代码和初始化脚本
     7.5 使用 Dockerfile 构建镜像
     7.6 在容器化 IRIS 终端中运行指令
  8. 结语和未来计划


1. 本文目的

InterSystems 开发者社区已经有很多优秀的文章解释了 Docker 是什么、最重要的命令以及 InterSystems IRIS 在容器化环境中的多个用例。

本系列文章的目的略有不同。 由于我非常喜欢分步指南,我想创建一份全面的讲解,介绍如何在 InterSystems IRIS 中配置和使用 Docker,我们先从最基础的场景开始,逐步过渡到更高级的场景,例如多命名空间实例、互连容器、与外部系统的集成以及用于了解 UI 的应用程序。

2. 什么是容器,它们为什么对 IRIS 有意义

2.1 容器和镜像简介

按照传统方法,要想运行应用程序,需要将版本与您的操作系统进行匹配,并针对特定目标对其进行打包。 同时,每个应用程序都应当打包,以便专门与某个目标系统配合使用。 如果您希望应用程序在 macOS 和 Windows 上运行,必须更改应用程序设计并针对不同的系统进行打包。Docker 镜像和容器是应用程序部署技术,通过让开发者将软件打包一次并在任何地方运行来解决此问题。

Docker 是一个将软件打包到容器中的软件平台。 Docker 镜像(或容器镜像)是独立的可执行文件,包含创建和运行容器的所有指令(库、依赖项和文件)。 Docker 镜像可共享、可移植,因此您可以一次在多个位置部署同一个镜像。Docker 容器是一个运行时环境,具有运行应用程序代码所需的所有必要组件,无需使用主机依赖项。  

与虚拟机不同,容器是轻量级的。 它们不需要完整的操作系统,只使用特定应用程序所需的二进制文件和库,通过 Docker 引擎直接在主机操作系统上运行,这使其更加高效。 多个隔离的容器可以在同一台计算机上并行启动,互不干扰。

2.2 为什么容器对开发者很有用

  • 隔离:在清晰、可重现的环境中运行,不会影响您的主机系统。
  • 可重现性:确保您的设置在不同的计算机上以相同的方式工作。
  • 轻松设置:使用一个命令,只需几秒钟即可启动 IRIS 实例,无需手动安装。

2.3 为什么 IRIS 可以很好地与 Docker 配合使用

在 Docker 中运行 InterSystems IRIS 有几项优势:

  • 应用程序运行并且可以在隔离的容器中进行测试
  • 可以使用共享版本控制系统(如 Git),无需直接在服务器上操作
  • 容器化环境可以在任何阶段重现,从而在整个软件生命周期中保持一致性。
  • 您的应用程序可以轻松地在每台计算机上运行。

3. 先决条件

要在 Docker 容器中运行 InterSystems IRIS,您必须具有:

4. 安装 InterSystems IRIS 镜像

4.1 使用 Docker Hub

Docker Hub 是 Docker 镜像的中心注册表。 它提供了一个庞大的预构建镜像库,您可以将其作为切入点。 InterSystems 在其中发布官方 IRIS 社区版镜像,您可以下载该镜像以在自己的容器中本地运行 IRIS。 您还可以使用 Docker Hub 推送自己的自定义镜像,以便在团队中共享或分发给社区。Docker Hub 既可以在线使用,也可以嵌入到 Docker Desktop 中。

4.2 拉取镜像

一些常见的 Docker 镜像命令包括:

命令描述
docker pull <image>从 Docker Hub 下载镜像
docker images列出所有本地镜像
docker rmi <image>移除一个或多个镜像

您可以直接在镜像的 Docker Hub 页面上找到确切的拉取命令:

对于 InterSystems IRIS 镜像,该命令为:

docker pull intersystems/iris-community:latest-cd

或者,您可以在 Docker Desktop 搜索栏中搜索 iris-community 并点击 Pull

安装后,您应当拥有在本地镜像中列出的 InterSystems IRIS 镜像:

5. 运行 InterSystems IRIS 镜像

从 Docker Hub 中拉取出 InterSystems IRIS 镜像后,您可以在容器内运行该镜像。

以下是常用的 Docker 容器命令

命令描述
docker run -d <image>以分离模式运行:在后台启动容器并立即将控制权返还给终端。
docker run -p <host>:<container> <img>将主机端口映射到容器端口
docker ps列出正在运行的容器
docker ps -a列出所有容器(包括已停止的容器)
docker exec -it <container> bash在正在运行的容器中执行命令
docker logs <container>查看容器日志
docker stop <container>停止正在运行的容器
docker start <container>启动已停止的容器
docker restart <container>重启容器
docker rm <container>移除容器

5.1 启动 IRIS 容器

您可以通过 Docker Desktop UI 启动名为“my-iris”的 InterSystems IRIS 社区版容器,只需在 Images 面板中点击要运行的镜像的 Run 按钮即可。 对于 InterSystems 镜像,可以指定一些可选的设置,例如在主机上公开哪些端口来与容器内运行的服务进行通信。

可以通过上面显示的菜单完成操作,具体如下:

  • 左侧 → 主机上的端口
  • 右侧 → 容器内的端口

常用 IRIS 端口(容器内)

  • 1972 → 超级服务器端口:由 IRIS 用于网络协议(ObjectScript、JDBC 等)。
  • 52773 → Web 服务器端口:由 IRIS 用于管理门户(Web 界面)。

如果没有显式映射端口,Docker 将在主机上指定随机端口。

或者,可以使用终端来运行容器:

docker run --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystems/iris-community:latest-cd

在本例中:

  • 主机上的 9091 映射到容器内的 1972(超级服务器)。
  • 主机上的 9092 映射到容器内的 52773(管理门户)。

5.2 检查容器状态

运行此命令后,运行 docker ps 以验证容器是否正常运行。

> docker ps
CONTAINER ID   IMAGE                                   COMMAND                 CREATED         STATUS                            PORTS                                                                                        NAMES
907d4c2b4ab5   intersystems/iris-community:latest-cd   "/tini -- /iris-main"   3 seconds ago   Up 2 seconds (health: starting)   0.0.0.0:9091->1972/tcp, [::]:9091->1972/tcp, 0.0.0.0:9092->52773/tcp, [::]:9092->52773/tcp   my-iris

正在运行的容器也会列在 Docker Desktop Containers 面板中:

相关镜像的状态将是 In Use,如 Images 面板中所示:

5.3 在容器终端执行代码

当容器状态显示 Running 时,表示一切正常。 

您可以进行测试,只需打开容器终端(点击 Docker Desktop 的 Containers 面板内的容器名称并转到 Exec)并输入以下内容即可:

iris session IRIS

这将在 Docker 容器中打开一个 IRIS 终端,您可以在其中使用标准的 ObjectScript 语法来执行命令和脚本。

5.4 访问容器化实例的 IRIS 管理门户

接下来,打开浏览器并导航到:

http://localhost:9092/csp/sys/UtilHome.csp

默认情况下,IRIS 容器使用用户 _SYSTEM 和密码 SYS。登录后需要更改密码。

这将为您提供 IRIS 管理门户的完整访问权限,这样您可以直接从 Web 界面管理命名空间、数据库和其他 IRIS 功能。

5.5 将容器连接到 VSCode IDE

您可以使用映射的超级服务器端口(默认为容器内的 1972,例如主机上的 9091)和 Web 服务器端口(默认为容器内的 52773,例如主机上的 9092)将您喜欢的 IDE(例如 VS Code 或 Studio)连接到 IRIS 容器。 这样您可以直接针对正在运行的容器开发和测试 ObjectScript 代码。

将容器连接到 VSCode:

  • 安装 InterSystems ObjectScript 扩展程序包
  • 打开 InterSystems Server 扩展程序
  • 点击三个点和“Edit server”
  •  
  • 点击“Edit in settings.json”
  • 将此元素添加到“intersystems.servers”json:
"docker_iris": {
    "webServer": {
        "scheme": "http",
        "host": "localhost",
        "port": 9092
    },
    "description": "Connection to Docker container."
}
  • 服务器现已连接。 您可以使用 _SYSTEM 用户登录。
  • 您可以看到,USER 是唯一可用的命名空间:

5.6 停止或移除容器

要停止正在运行的容器,请使用以下命令:

docker stop my-iris

再次启动容器

要再次启动容器,请使用以下命令:

docker start my-iris

移除(删除)容器

要移除容器实例,但移除镜像,请使用:

docker rm my-iris

除非您挂载了卷,否则容器内的所有数据都将丢失(我们将在后续段落中讨论这个问题)。

5.7 使用绑定挂载设置特定密码

在启动容器时,可以使用密码文件设置自定义密码。 该文件将保存在我们的主机上,并使用绑定挂载机制复制到容器中。

当您使用绑定挂载时,主机上的文件或目录将从主机挂载到容器中,从而允许在 Docker 主机上的开发环境和容器之间共享源代码或构建工件。

  • 创建名为 password.txt 的文件,其中仅包含字符串形式的密码(注意! 记下密码,以后会用到)。
  • 复制其路径,本例中为 C:\InterSystems\DockerTest\password\password.txt
  • 运行以下命令:
docker run --name my-iris -d --publish 9091:1972 --publish 9092:52773 --volume "C:\InterSystems\DockerTest:/durable" intersystems/iris-community:latest-cd --password-file /durable/password/password.txt 

容器运行后,可以使用用户 _SYSTEM  和您在密码文件中写下的密码登录。

在 Docker 容器内,您会看到一个 password.txt.done 文件。您的主机文件夹中会有一个相同的文件。

文件扩展名会更改为 .done,以避免密码以纯文本形式保留。 这是 InterSystems IRIS 中对密码文件的标准操作。 因此,在从 password.txt 文件读取密码并将默认 IRIS 用户 (_SYSTEM) 更新为该密码后,出于安全原因,该文件会附加 .done 并移除密码。

您可以使用自定义密码登录管理门户(我告诉过您记下来 :D)。 登录后,InterSystems IRIS 不会强迫您更改密码。

请注意,如果在没有挂载任何持久化卷的情况下移除了容器,然后重启(有关详情,请参阅下一段),则不会再次从 password.txt 文件中读取密码,因为它已被替换为 password.txt.done。 如果是这种情况,将使用标准的“SYS”密码。 

5.8 使用特定的持久化卷启动容器

默认情况下,当您使用 docker rm <container's name> 命令移除正在运行的 Docker 容器时,保存在该容器内的任何内容都将消失。

为了避免丢失数据,InterSystems IRIS 提供了持久化 %SYS 功能。 这可以让实例将所有重要的文件都存储在您的主机上,以便在容器和实例重启后它们仍然存在。

5.8.1 可以使用持久化 %SYS 存储什么?

一些示例包括:

  • 配置文件(iris.cpfhttpd.conf
  • Web 网关配置和日志 (/csp)
  • 系统数据库(IRISUSERIRISSECURITYIRISTEMP 等)
  • 日志、写入镜像文件 (WIJ) 和临时文件
  • 日志文件(messages.logSystemMonitor.log 等)
  • 许可证密钥 (iris.key)
  • 您创建的任何其他数据库

5.8.2 如何启用持久化 %SYS

首先,从主机中选择一个文件夹,如 C:\InterSystems\DockerTest

  • 在 Linux 上,创建 irisowner 用户并为其授予目录所有权,确保 IRIS 可以写入该文件夹:
adduser irisowner
chown -R irisowner:irisowner /InterSystems/DockerTest
  • 在 Windows 上,您可以跳过这一段,因为 Docker Desktop 将使用您当前的 Windows 用户权限挂载该文件夹。

然后,挂载您的主机文件夹并使用 ISC_DATA_DIRECTORY 变量告知 IRIS 将其持久化数据写入何处:

  --volume "C:\InterSystems\DockerTest:/durable" --env ISC_DATA_DIRECTORY=/durable/iris

在终端上运行的完整指令是:

docker run --name my-iris -d --publish 9091:1972 --publish 9092:52773 --volume "C:\InterSystems\DockerTest:/durable" --env ISC_DATA_DIRECTORY=/durable/iris intersystems/iris-community:latest-cd --password-file /durable/password/password.txt

此时,您可以检查您的容器,看到一个持久化文件夹已装载并包含目录 iris/(对于持久化 %SYS)和 password/。 在主机上,您也可以看到以下两个目录:

如果容器停止并被移除,当您使用相同的 Docker Compose 命令重新创建容器时,IRIS 将使用 iris/ 文件夹中的数据恢复其先前的状态(用户、配置、日志、数据库等),因此不会丢失任何内容。 您可以通过创建 Web 应用程序、停止并移除容器,然后再次创建来进行测试。 如果不使用持久化 %SYS 功能,每次移除容器并启动新实例时,%SYS 内的任何更改都会丢失。

请注意,如果删除了 iris/ 文件夹,下次启动 IRIS 容器时,由于无法找到先前的 %SYS 数据,它将像在全新安装中一样进行初始化。 将创建一个全新的 iris/ 文件夹。

6. 使用 Docker Compose 

到目前为止,您一直在使用一个长命令 docker run 启动 InterSystems IRIS。 这虽然可行,但很快就会难以使用普通的 Shell 命令来管理一切。

Docker Compose 是一个 YAML 配置文件,用于定义如何运行一个或多个容器。这简化了整个应用程序栈的控制,使管理服务、网络和卷变得更加容易。 只需一个命令,即可从配置文件创建并启动所有服务。

以下是 Docker compose 的常用命令

命令描述
docker compose up -d以分离模式启动 docker-compose.yml 中定义的所有服务(默认情况下,使用当前文件夹中的 docker-compose.yml 文件)。
docker compose -f ./path/to/docker-compose.yml up -d从另一个目录中的 compose 文件启动服务。
docker compose down停止并移除由 docker compose up 创建的所有容器、网络和卷。
docker compose ps列出由 Compose 管理的容器。
docker compose logs查看 Compose 文件中定义的所有服务的日志。
docker compose logs <service>查看特定服务(例如,iris)的日志。
docker compose exec <service> bash在由 Compose 管理的正在运行的容器内打开一个 Shell。
docker compose stop停止正在运行的容器,但不将其移除。
docker compose start启动之前停止的容器。
docker compose restart重启 Compose 文件中定义的所有容器。
docker compose build构建或重建由 Dockerfile 定义的服务。
docker compose pull拉取服务的最新镜像。
docker compose config验证并查看 Compose 文件中的合并配置。

6.1 Docker Compose 示例

要使用 Docker Compose,必须创建一个 docker-compose.yml 文件,其中包含您要创建和启动的容器的所有配置。

这样一来,以下命令:

docker run --name my-iris -d --publish 9091:1972 --publish 9092:52773 --volume "C:\InterSystems\DockerTest:/durable" --env ISC_DATA_DIRECTORY=/durable/iris intersystems/iris-community:latest-cd --password-file /durable/password/password.txt

可被替换为下方的 docker-compose.yml

# docker-compose.yml     
services:
  iris:
    container_name: my-iris
    image: intersystems/iris-community:latest-cd
    init: true
    volumes:
      # System/persistent data (IRIS installation, databases, etc.)# On Windows, you can use either: "C:\\InterSystems\\DockerTest:/durable"
      - C:/InterSystems/DockerTest:/durable
    ports:
      - "9092:52773"# Management Portal / REST APIs
      - "9091:1972"# SuperServer port
    environment:
      - ISC_DATA_DIRECTORY=/durable/iris
    # Use the password file to log within the container
    command: --password-file /durable/password/password.txt

6.2 运行 Docker Compose 

在保存 Docker Compose 文件的目录中打开一个终端(或使用 -f 选项)并运行以下命令:

docker compose up -d

您的 IRIS 容器将以 Docker Compose 文件中指定的确切配置启动。

在 Docker Desktop 中,您现在可以看到一个名为“dockertest”的 Compose 栈(它采用保存 Docker Compose 的文件夹的名称)已经创建并与容器“my-iris”相关联:

7. 使用 Dockerfile 运行自定义源代码

到目前为止,您一直在直接从官方 Docker 镜像运行 InterSystems IRIS。 不过,在构建镜像时,我们可能需要自动加载镜像中的 ObjectScript 类或其他自定义代码。

Dockerfile是一个文本文件,其中包含从基础镜像(如 intersystems/iris-community:latest-cd)开始构建镜像的指令。 使用 Dockerfile,我们可以将自定义源代码添加到容器中,并在构建镜像时运行自定义命令。

7.1 Dockerfile 示例

下一个示例提供了一个执行以下操作的 Dockerfile:

  • 从官方 InterSystems IRIS 镜像启动镜像。
  • 将应用程序代码从 src/ 文件夹复制到容器。
  • 运行脚本来导入类并初始化容器化的应用程序,然后将日志保存到日志文件中。
  • 公开默认的 InterSystems IRIS 端口。

7.2 Docker Compose 示例

您还应当修改 Docker Compose,以指定从当前文件夹中的 Dockerfile 构建镜像:

# docker-compose.yml     
services:
  iris:
    container_name: my-iris
    build: # this tells Docker to build a new image based on the one specified in the Dockerfile
      context: .        # build the image from local Dockerfile
      dockerfile: Dockerfile
    image: my-modified-iris-image:latest   # give the new image a new tag to avoid overriding the base image
    init: true
    volumes:
      # System/persistent data (IRIS installation, databases, etc.)# On Windows, you can use either: "C:\\InterSystems\\DockerTest:/durable"
      - C:/InterSystems/DockerTest:/durable
    ports:
      - "9092:52773"# Management Portal / REST APIs
      - "9091:1972"# SuperServer port
    environment:
      - ISC_DATA_DIRECTORY=/durable/iris
    # Use the password file to log within the container
    命令:--password-file /durable/password/password.txt

7.3 了解层、镜像标记和构建与 运行时

在 Docker 中,正如什么是镜像?中所述,有两个重要的原则需要牢记:

  1. 镜像不可变:创建完镜像后,将无法进行修改。 您只能生成新的镜像或在镜像上添加更改。
  2. 容器镜像由层组成:每一层代表一组添加、移除或修改文件的文件系统更改。

执行 Dockerfile 中指定的指令时,新层会添加到镜像中。 这些层也将显示在镜像信息中。

考虑到这一点,务必区分 Docker 在构建时(当它从 Dockerfile 创建镜像时)和运行时(当它从该镜像启动容器时)的作用。

以下每个 Dockerfile 指令都在构建时执行:

  • COPY:将文件复制到镜像中
  • RUN:执行命令并将结果保存为新的镜像层
  • ENTRYPOINT:不改变文件系统,而是定义将在运行时启动的默认进程
  • EXPOSE:设置元数据,指示镜像打算使用哪些端口

运行时,Docker 不会重建镜像,而是在镜像上添加一个容器层。容器运行时所做的所有更改(如新文件、编辑、日志)都会进入这个临时层。

从上一个 Docker Compose 示例来看:

build: # this tells Docker to build a new image based on the one specified in the Dockerfile
  context: .        # build the image from local Dockerfile
  dockerfile: Dockerfile
image: my-modified-iris-image:latest   # give the new image a new tag to avoid overriding the base image

这些指令通过拉取基础镜像并按照 Dockerfile 中的描述进行修改,告知 Docker 创建一个名为“my-modified-iris-image:latest”的新镜像(这称为标签)。 用其他名称标记新镜像非常重要。如果我们不在新创建的镜像上放置标签,基础镜像会被新镜像覆盖。 官方镜像仍在 Docker Hub 上提供,但此本地版本会对其进行映射,并且每个引用该标签的项目现在都会不知不觉地使用包含多个新层的自定义镜像。

为了避免这种情况,请务必使用不同的标签来创建新的单独镜像,同时确保官方基础镜像干净、可重用。

7.4 源代码和初始化脚本

此时,我们应至少创建一个类,并将其放在 src/ 文件夹中。 该类将被复制到容器中,并通过 iris.script 文件导入,该文件包含在构建镜像时导入类和初始化应用程序所需的所有指令。

在项目文件夹中创建一个名为 src/DockerStepByStep 的新目录并创建以下类文件:

Class DockerStepByStep.cheers Extends%RegisteredObject
{

ClassMethod sayHi() As%Status { Set sc = $$$OKw"Hi mom!",! Return sc }

}

在项目的根目录中,创建一个名为 iris.script 的文件:

// Unexpire passwords for dev modezn"%SYS"Do##class(Security.Users).UnExpireUserPasswords("*")

// Load classes from durable sourcezn"USER"// Import classesset importPath = "/opt/irisapp/src"write"Loading classes at '", importPath, "' ...", ! set errors = ""do$System.OBJ.Import(importPath,"cuk",,.errors) if errors = 0 { write"Classes loaded successfully", ! } else { write errors, " errors occurred while loading classes!", ! }

halt

7.5 使用 Dockerfile 构建镜像

首次运行时,您可以使用以下命令从 Dockerfile 构建镜像(--build 标记会强制 Docker 从您的 Dockerfile 重建镜像):

docker-compose up --build

对于其他运行,如果 Dockerfile 未被修改,则可以简单地运行:

docker-compose up -d

开始构建镜像后,您会在终端中看到以下日志:

PS C:\InterSystems\DockerTest> docker-compose up --build
[+] Building 21.5s (13/13) FINISHED
 => [internal] load local bake definitions                                                                     0.0s
 => => reading from stdin 530B                                                                                 0.0s
 => [internal] load build definition from Dockerfile                                                           0.0s
 => => transferring dockerfile: 1.73kB                                                                         0.0s
 => [internal] load metadata for docker.io/intersystems/iris-community:latest-cd                              10.0s
 => [internal] load .dockerignore                                                                              0.0s
 => => transferring context: 2B                                                                                0.0s 
 => [1/6] FROM docker.io/intersystems/iris-community:latest-cd@sha256:93488df381f5868649e7bfc33a9083a3e86a22d  0.9s 
 => => resolve docker.io/intersystems/iris-community:latest-cd@sha256:93488df381f5868649e7bfc33a9083a3e86a22d  0.0s 
 => [internal] load build context                                                                              0.0s 
 => => transferring context: 147B                                                                              0.0s
 => [2/6] WORKDIR /opt/irisapp                                                                                 0.0s
 => [3/6] COPY src src                                                                                         0.1s 
 => [4/6] COPY iris.script .                                                                                   0.1s
 => [5/6] RUN mkdir -p /opt/irisapp/logs                                                                       0.3s
 => [6/6] RUN iris start IRIS &&     iris session IRIS < iris.script > /opt/irisapp/logs/build.log 2>&1 &&     4.5s 
 => exporting to image                                                                                         4.5s 
 => => exporting layers                                                                                        3.3s 
 => => exporting manifest sha256:3ce316cefa21a3707251c4287005a15b02e6dc0151b24baf2a82f76064792250              0.0s 
 => => exporting config sha256:00238e19edef86b29149d2eb89ff75f4d1465ba0d9a2ac4494a14d3bd3746a94                0.0s 
 => => exporting attestation manifest sha256:3579cab5c8accc7958090276deb60bd7dbbc2ecbf13af8e7fa8c4ff2dfe91028  0.0s 
 => => exporting manifest list sha256:17b969c340f57d611cc7603287cc6db50cffd696258a72b5648ece0a919676ac         0.0s 
 => => naming to docker.io/intersystems/iris-community:latest-cd                                               0.0s 
 => => unpacking to docker.io/intersystems/iris-community:latest-cd                                            0.9s 
 => resolving provenance for metadata file                                                                     0.0s 
[+] Running 3/3
 ✔ intersystems/iris-community:latest-cd  Built                                                                0.0s 
 ✔ Network dockertest_default             Created                                                              0.1s 
 ✔ Container my-iris                      Created                                                              0.2s 

在第 6/6 步中,iris.script 文件被执行到容器化的 IRIS 实例中,日志保存在路径 /opt/irisapp/logs/build.log 中。

要查看日志,可以运行以下指令:

docker exec -it my-iris cat /opt/irisapp/logs/build.log

您应当看到以下记录,这些记录会告知您类编译的结果:

Node: buildkitsandbox, Instance: IRIS

USER>

USER>

%SYS>

%SYS>

%SYS>

%SYS>

USER>

USER>

USER>

USER> Loading classes at '/opt/irisapp/src' ...

USER>

USER>

Load of directory started on 09/16/202507:46:28 Loading file /opt/irisapp/src/DockerStepByStep/cheers.cls as udl

Compilation started on 09/16/202507:46:28 with qualifiers 'cuk' Class DockerStepByStep.cheers is up-to-date. 编译在 0.005s 内成功完成。

Load finished successfully.

USER> Classes loaded successfully

USER>

USER>

在 Docker Desktop 上,您可以看到一个名为“my-modified-iris-image”的新镜像已创建,并且正在与基础官方镜像一起运行。

如果检查这些镜像,您会发现自定义镜像由 31 层组成,而不是原始镜像的 25 层。 新层与 Dockerfile 在构建时执行的指令相对应:

7.6 在容器化 IRIS 终端中运行指令

要测试这些类,您可以在容器化 IRIS 实例中激活 IRIS 终端。 为此,请执行以下指令:

docker exec -it my-iris iris session IRIS

此时,您可以使用以下命令从 USER 命名空间调用 ClassMethod:

do##class(DockerStepByStep.cheers).sayHi()

最后,您应当看到以下输出:

PS C:\InterSystems\DockerTest> docker exec -it my-iris iris session IRIS

Node: 41c3c7a9f2e4, Instance: IRIS

USER>do##class(DockerStepByStep.cheers).sayHi() Hi mom!

8. 结语和未来计划

我们已经完成了在 Docker 中运行 InterSystems IRIS 的整个周期:

  • 拉取镜像
  • 启动并配置容器
  • 使用持久化 %SYS 来持久化数据
  • 使用自己的代码和脚本构建自定义镜像

以上内容足以让您在容器化环境中试验 IRIS 并将其用于开发。

您可以访问 GitHub 仓库,其中包含最后一部分讨论的所有文件(Docker Compose、Dockerfile、iris.script 等)。

敬请期待下一篇文章!

1
0 15
文章 Nicky Zhu · 十月 28, 2025 4m read

简介

在现代应用程序中,尤其是那些涉及大型数据、文档、日志或多媒体的应用程序,高效地处理大型或非结构化内容变得至关重要。 InterSystems IRIS 提供了一种强大、可扩缩的方式来使用流对象管理此类数据。

流对象可以让开发者在处理大型文本或二进制数据时不受字符串大小上限或内存效率低下的影响。 在本文中,我们将探讨如何使用 ObjectScript 在 IRIS 中创建、读取、写入、存储和操作流对象。


IRIS 中的流对象是什么?

InterSystems IRIS 在 %Stream 软件包下提供了内置流类,用于表示可以增量读取或写入的字符或字节序列。 这些流在处理以下内容时特别有用:

  • 文本文档(日志、报告等)
  • 二进制文件(图像、PDF)
  • 大型 API 有效负载(文件上传/下载)
  • 超出字符串上限 (~3.6MB) 的持久类属性

流类型

流类型用例
字符流%Stream.GlobalCharacter%Stream.FileCharacter大型文本数据
二进制流%Stream.GlobalBinary%Stream.FileBinary图像、PDF、二进制文件

创建并写入流

下面介绍了如何创建和写入全局字符流

 

Set stream = ##class(%Stream.GlobalCharacter).%New() Do stream.Write("This is line one.") Do stream.WriteLine("This is line two.") .Write() 方法会将文本追加到流之后,而 .WriteLine() 则会在结尾添加一个换行符。


从流中读取

写入流后,您可以使用 .Read().ReadLine() 进行读取:

 

Do stream.Rewind() Set line1 = stream.ReadLine() Set line2 = stream.ReadLine() Write line1, !, line2

如果您已经写入流,请在读取前始终调用 .Rewind(),这会将内部指针重置到起点。


将流保存到文件中

流对象可以直接保存到文件中:

 

Set sc = stream.OutputToFile("/tmp/output.txt") If $$$ISERR(sc) { Write "Error saving file" } 类似地,您可以从文件读取到流中:

 

Set fileStream = ##class(%Stream.FileCharacter).%New() Set fileStream.Filename = "/tmp/input.txt" Set sc = fileStream.CopyTo(stream) ; Copy contents into another stream


在持久类中存储流对象

流可以轻松地与持久对象集成。 您可以在数据模型中将流定义为属性:

 

Class MyApp.Report Extends (%Persistent) { Property Title As %String; Property Content As %Stream.GlobalCharacter; } 您现在可以将大量内容保存为数据模型的一部分:

 

Set report = ##class(MyApp.Report).%New() Set report.Title = "October Report" Set report.Content = ##class(%Stream.GlobalCharacter).%New() Do report.Content.Write("Full report content goes here...") Do report.%Save()


二进制流

对于非文本数据(例如,图像或附件),请使用 %Stream.GlobalBinary

 

Set binStream = ##class(%Stream.GlobalBinary).%New() Do binStream.Write($Char(255, 216, 255)) ; Sample binary data (JPEG header) Do binStream.OutputToFile("/tmp/sample.jpg")


流对象的常见用例

  • 上传/下载 REST API 文件
    在自定义 REST 服务中使用流输入/输出来处理大型多部分文件上传。
  • 存储 PDF 文件或日志
    将应用程序日志或报告存储在数据库中,而不会达到字符串大小上限。
  • 数据归档
    在数据库中将二进制备份或导出文件保存为 BLOB。
  • 生成动态文件
    在通过 HTTP 发送文件或将文件保存到磁盘之前,使用流在内存中生成文件。

技巧与最佳实践

  • 在读取刚刚写入的流之前,务必倒回
  • 使用流复制以实现高效的内存处理:source.CopyTo(destination)
  • 对于二进制数据,切勿使用字符流,因为这样可能会损坏内容。
  • 监控 .Size 以跟踪流长度。
  • 使用 %JSONExportToStream() 将对象直接序列化为流(例如,用于 REST 响应)。

示例:将对象导出为 JSON 流

 

Set obj = ##class(MyApp.Report).%OpenId(1) Set jsonStream = ##class(%Stream.GlobalCharacter).%New() Do obj.%JSONExportToStream(.jsonStream) Do jsonStream.OutputToFile("/tmp/export.json")


结语

流对象是每个 InterSystems IRIS 开发者工具箱中必不可少的工具。 它们提供了一种灵活、可扩缩且高效的方式来处理应用程序中的大型或非结构化数据,无论您是存储日志、操作文件,还是传输大型有效负载,都可以使用。

在了解完如何创建、操作和持久化流后,您在 IRIS 环境中处理数据的能力将提升到新的水平。


0
0 12
文章 Nicky Zhu · 十月 28, 2025 9m read

技术文档 — Quarkus IRIS Monitor System

1. 目的与范围

此模块支持在基于 Quarkus 的 Java 应用程序与 InterSystems IRIS 的原生性能监控功能之间进行集成。
它使开发者可以通过 @PerfmonReport 对方法添加注释,这样可以在执行方法时自动触发 IRIS 的 ^PERFMON 例程,以生成性能报告,而无需人工干预。


2. 系统组件

2.1 注释:@PerfmonReport

  • 定义为 CDI InterceptorBinding
  • 可应用于方法或类。
  • 指示使用 IRIS 监控逻辑包装方法执行的框架。

2.2 拦截器:PerfmonReportInterceptor

  • 拦截对带注释的方法的调用。

  • 执行流程:

    1. 记录启动事件 (LOG.infof("INIT: …"))
    2. 调用 monitorSystem.startPerfmon()
    3. 继续执行 context.proceed()
    4. finally 块中:
      • 调用 monitorSystem.generateReportPerfmon(...)
      • 调用 monitorSystem.stopPerfmon()
      • 记录结束事件及执行时间
  • 确保即使抛出异常,监控也始终结束。

2.3 DAO Bean:MonitorSystem

  • 带有 @ApplicationScoped 注释的 CDI bean。

  • 保存启动时初始化的 IRIS 的单个实例。

  • 通过 @ConfigProperty 注入的配置(JDBC URL、用户、密码)。

  • 使用 DriverManager.getConnection(...) 获得原始 IRISConnection

  • 包含方法:

    • startPerfmon()
    • generateReportPerfmon(String reportName)
    • stopPerfmon()
  • 每一个都通过 iris.classMethodVoid(...) 调用 iris.src.dc.AdapterPerfmonProc 中合适的 ObjectScript 方法。

2.4 ObjectScript 适配器:iris.src.dc.AdapterPerfmonProc

  • 定义封装 ^PERFMON 逻辑的例程:

      Class iris.src.dc.AdapterPerfmonProc Extends %RegisteredObject
      {
          ClassMethod start() As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              set status = $$Stop^PERFMON()
              set status = $$Start^PERFMON()
              zn namespace
              return status
          }
    
          ClassMethod generateReport(nameReport As %String = "report.txt") As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              Set tempDirectory = ##class(%SYS.System).TempDirectory()
              set status = $$Report^PERFMON("R","R","P", tempDirectory_"/"_nameReport)
              zn namespace
    
              return status
          }
    
          ClassMethod stop() As %Status
          {
              Set namespace = $NAMESPACE
              zn "%SYS"
              Set status = $$Stop^PERFMON()
              zn namespace
    
              return status
          }
      }
    
  • 在命名空间 %SYS 中运行以访问 ^PERFMON 例程,然后返回到原始命名空间。


3. 执行流程

  1. 一个请求进入 Quarkus 应用程序。

  2. CDI 拦截器检测 @PerfmonReport 注释并拦截方法调用。

  3. monitorSystem.startPerfmon() is invoked, triggering IRIS ^PERFMON monitoring.

  4. 业务方法正常执行(数据访问、转换、逻辑等)。

  5. 在方法返回或抛出异常后,拦截器确保:

    • 调用 monitorSystem.generateReportPerfmon(...) 以创建 .txt 性能报告。
    • 执行 monitorSystem.stopPerfmon() 以停止监控会话。
    • 使用 Logger.infof(...) 记录 Java 端的总执行时间。
  6. 生成的报告文件存储在 IRIS 临时目录中,通常为:/usr/irissys/mgr/Temp/

    • 文件名遵循以下模式: <ClassName><MethodName><timestamp>.txt

4. 技术挑战和解决方案

挑战解决方案
在使用池化 JDBC 连接时出现 ClassCastException使用 DriverManager.getConnection(...) 获得原生 IRISConnection 而非池化 ConnectionWrapper
反复打开连接产生的开销@ApplicationScoped bean 中维护单个 IRIS 实例,通过 @PostConstruct 初始化。
确保即使在出现异常时 ^PERFMON 也始终停止在拦截器中使用 try-finally 来调用 stopPerfmon()generateReportPerfmon()
配置可移植性使用 @ConfigPropertyapplication.properties 注入连接设置(jdbc.urlusernamepassword
管理并发监控会话避免对高度并发的端点添加注释。 以后的版本可能会实现会话级隔离。

5. 用例和优势

  • 可以从 Java 代码实时查看 IRIS 运行时活动。
  • 为开发者简化了性能分析查询优化工作。
  • 基准测试分析系统回归测试很有用。
  • 可以作为关键操作的轻量级性能审核跟踪

6. 实际使用示例

请在以下位置查看完整的源代码和部署设置:


6.1 概述

该应用程序运行一个 Quarkus 服务器,后者连接到使用 FHIRSERVER 命名空间配置的 InterSystems IRIS 实例
ORM 层使用带 PanacheRepository 的 Hibernate ORM 实现,允许在 Java 实体与 IRIS 数据库类之间直接映射。

当应用程序(通过 docker-compose up)启动时,它会打开:

  • IRIS 容器,托管 FHIR 数据模型和 ObjectScript 例程(包括 AdapterPerfmonProc);
  • Quarkus 容器,公开 REST 端点并通过原生 JDBC 驱动程序连接到 IRIS。

6.2 REST 端点

REST 资源会公开一个简单的端点来检索患者信息:

@Path("/patient")
public class PatientResource {

    @Inject
    PatientService patientService;

    @GET
    @Path("/info")
    @Produces(MediaType.APPLICATION_JSON)
    public PatientInfoDTO searchPatientInfo(@QueryParam("key") String key) {
        return patientService.patientGetInfo(key);
    }
}

此端点接受一个查询参数(密钥),该参数标识了 FHIR 数据仓库中的患者资源。


### 6.3 带有 @PerfmonReport 的服务层

PatientService 类包含用于检索和撰写患者信息的业务逻辑。 它带有 @PerfmonReport 注释,这意味着对 /pantion/info 的每个请求都会触发 IRIS 性能监控:

@ApplicationScoped
public class PatientService {

    @Inject
    PatientRepository patientRepository;

    @PerfmonReport
    public PatientInfoDTO patientGetInfo(String patientKey) {

        Optional<Patient> patientOpt = patientRepository.find("key", patientKey).firstResultOptional();
        Patient patient = patientOpt.orElseThrow(() -> new IllegalArgumentException("Patient not found"));

        PatientInfoDTO dto = new PatientInfoDTO();
        dto.setKey(patient.key);
        dto.setName(patient.name);
        dto.setAddress(patient.address);
        dto.setBirthDate(patient.birthDate != null ? patient.birthDate.toString() : null);
        dto.setGender(patient.gender);
        dto.setMedications(patientRepository.findMedicationTextByPatient(patientKey));
        dto.setConditions(patientRepository.findConditionsByPatient(patientKey));
        dto.setAllergies(patientRepository.findAllergyByPatient(patientKey));

        return dto;
    }
}

6.4 执行流程

GET /patient/info?key=Patient/4 提出请求

Quarkus 将请求路由到 PatientResource.searchPatientInfo()

CDI 拦截器在 PatientService.patientGetInfo() 中检测 @PerfmonReport 注释。

在执行服务逻辑前:

  • 拦截器调用 MonitorSystem.startPerfmon(),这会调用 IRIS 类 iris.src.dc.AdapterPerfmonProc.start()

  • 方法执行业务逻辑,使用 Hibernate PanacheRepository 映射查询患者数据。

在方法完成后:

  • 调用 MonitorSystem.generateReportPerfmon() 以创建性能报告。

  • MonitorSystem.stopPerfmon() 停止 IRIS 性能监视器。

usr/irissys/mgr/Temp/ 下生成一个 .txt 报告

示例文件名:PatientService_patientGetInfo_20251005_161906.txt

6.5 结果

生成的报告包含详细的 IRIS 运行时统计信息,例如:

                         Routine Activity by Routine

Started: 10/11/2025 05:07:30PM                    Collected: 10/11/2025 05:07:31PM

Routine Name                        RtnLines  % Lines   RtnLoads  RtnFetch  Line/Load Directory
----------------------------------- --------- --------- --------- --------- --------- ---------
Other                                     0.0       0.0       0.0       0.0         0
PERFMON                                  44.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%occLibrary                         3415047.0      34.1   48278.0       0.0      70.7 /usr/irissys/mgr/irislib/
iris.src.dc.AdapterPerfmonProc.1          7.0       0.0       2.0       0.0       3.5 /usr/irissys/mgr/FHIRSERVER/
%occName                            5079994.0      50.7       0.0       0.0         0 /usr/irissys/mgr/irislib/
%apiDDL2                            1078497.0      10.8   63358.0       0.0      17.0 /usr/irissys/mgr/irislib/
%SQL.FeatureGetter.1                 446710.0       4.5   66939.0       0.0       6.7 /usr/irissys/mgr/irislib/
%SYS.WorkQueueMgr                       365.0       0.0       1.0       0.0     365.0 /usr/irissys/mgr/
%CSP.Daemon.1                            16.0       0.0       1.0       0.0      16.0 /usr/irissys/mgr/irislib/
%SYS.TokenAuth.1                         14.0       0.0       5.0       0.0       2.8 /usr/irissys/mgr/
%Library.PosixTime.1                      2.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislib/
%SYS.sqlcq.uEXTg3QR7a7I7Osf9e8Bz...      52.0       0.0       1.0       0.0      52.0 /usr/irissys/mgr/
%SYS.SQLSRV                              16.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%apiOBJ                                 756.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislib/
FT.Collector.1                            0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
SYS.Monitor.FeatureTrackerSensor.1        0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%SYS.Monitor.Control.1                    0.0       0.0       0.0       0.0         0 /usr/irissys/mgr/
%SYS.DBSRV.1                            252.0       0.0       4.0       0.0      63.0 /usr/irissys/mgr/
%sqlcq.FHIRSERVER.cls12.1                19.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls13.1                74.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls14.1                74.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%sqlcq.FHIRSERVER.cls15.1                52.0       0.0       0.0       0.0         0 /usr/irissys/mgr/irislocaldata/
%SYS.System.1                             1.0       0.0       0.0       0.0         0 /usr/irissys/mgr/

通过这些数据,可以精确了解 IRIS 在 REST 调用期间内部执行了哪些例程 — 包括 SQL 编译、执行和 FHIR 数据访问。

洞察%sqlcq.FHIRSERVER.* 例程会捕获 Quarkus 在该方法中执行的所有 SQL 缓存查询。 监控这些例程可以让开发者分析查询执行情况、了解代码行为并发现潜在的性能瓶颈。 这使它们成为开发和调试 FHIR 相关操作的强大工具。

image

6.6 总结

此示例演示了标准 Quarkus 服务如何使用 @PerfmonReport 注释以透明的方式利用 IRIS 原生监控工具。 它结合了:

  • CDI 拦截器 (Quarkus)

  • Hibernate PanacheRepositories (ORM)

  • IRIS 原生 ObjectScript 例程 (^PERFMON)

结果是产生了一种完全自动化、可重现的性能分析机制,这种机制可以应用于应用程序中的任何服务方法。

0
0 11
文章 Nicky Zhu · 十月 28, 2025 2m read

InterSystems 常见问题解答标题

^%GCMP 实用工具可用于比较两个全局变量的内容。

例如,要比较 USER 和 SAMPLES 命名空间中的 ^test 和 ^test,过程将与下面类似:
*以下示例在这两个命名空间中创建了 700 个相同的全局变量,并更改了其中一个的内容,使其成为检测目标。

USER>kill^test
USER>for i=1:1:100 { forj=1:1:7 { set^test(i,j)="Test"_i } }

USER>zn"samples"// change namespace to SAMPLES SAMPLES>kill^test SAMPLES>for i=1:1:100 { forj=1:1:7 { set^test(i,j)="Test"_i } }

SAMPLES>set^test(50,5,1)=1// Change one of the globals created in the SAMPLES namespace. SAMPLES>do^%GCMP Compare global ^test// Global to compare. on directory set: (this system) // Enter in namespace: SAMPLES => // Enter (if this namespace is OK) with global ^test=> // Global to compare on directory set: (this system) // Enter in namespace: SAMPLES => USER // Namespace to compare Output differences on Device: // Destination for output results. Press <Enter> to view in a terminal.// If you enter the full path of the log file name, the output will be sent there. Right margin: 80 =>

Compare global ^test in SAMPLES with global ^test in USER

^test(50,5,1) exists in ^|"SAMPLES"|test but not in ^|"USER"|test // Detects differing globals Time=.001822 SAMPLES>

如果要在不同服务器上的实例之间进行比较,而不是在同一实例中,请使用 ^DATACHECK 实用工具。 有关如何使用 ^DATACHECK 实用工具的说明,请参阅以下相关文章:

如何比较两个数据库中的多个全局变量和例程

0
0 19
InterSystems 官方 Claire Zheng · 十月 26, 2025

概述

此版本重点聚焦于多个InterSystems云服务在升级可靠性、安全功能扩展以及支持体验优化方面的提升。通过该版本,包括 FHIR Server、InterSystems Data Fabric Studio (IDS)、IDS with Supply Chain 和 IRIS Managed Services 在内的所有主要产品,现均支持高级安全功能,从而提供了统一且增强的安全态势。

新功能和增强功能

0
0 10
文章 Lilian Huang · 十月 24, 2025 14m read

学习如何使用 LangGraph 设计结合了推理、矢量搜索和工具集成的可扩缩自主 AI 智能体。

cover

概括

  • AI 智能体是一种超越简单的聊天机器人的自主系统,它结合了记忆库、上下文,并具有自动完成任务的主动性。
  • LangGraph 是一种框架,它使我们能够利用具有内置状态管理的节点(任务)和边缘(连接),构建复杂的 AI 工作流。
  • 本指南将指导您构建 AI 赋能的客户支持智能体,该智能体可以划分优先级,识别相关主题,并确定是上报还是自动回复。

那么,AI 智能体究竟是什么?

让我们直面它吧 —“AI 智能体”听起来就像可以接管会议室的机器人。 实际上,它们是您得力的助手,可以简化复杂的工作流,消除重复性任务。 您可以把它们看作是聊天机器人的下一个进化阶段:它们不只是简单地等待提示;它们可以发起行动,协调多个步骤,并随时进行调整。

过去,打造一个“智能”系统意味着兼顾语言理解、代码生成、数据查找等各种不同的模型,然后将它们粘合在一起。 您的一半时间花在了集成上,另一半时间则花在了调试上。

智能体彻底颠覆了这一切。 它们将上下文、主动性和适应性融合在一个精心编排的流程中。 它们不仅实现了自动化,更是肩负使命的智者。 借助 LangGraph 之类的框架,我相信,组建一支自己的智能体团队实际上会很有趣。

image

LangGraph 究竟是什么?

LangGraph 是一种创新型框架,它彻底改变了我们构建涉及大语言模型 (LLM) 的复杂应用程序的方式。

想象一下,您正在指挥一支管弦乐队:每种乐器(或“节点”)都需要知道何时演奏,声音有多大,顺序如何。 这种情况下,LangGraph 就是您的指挥棒,为您提供以下内容:

  • 图结构:它采用具有节点和边缘的图结构,使开发者能够设计适应各种分支和循环的灵活非线性工作流。 它可以反映复杂的决策过程,类似于神经通路的运作方式。
  • 状态管理:LangGraph 提供了各种内置工具,可以实现状态保持和错误恢复,简化了应用程序中各个阶段的上下文数据的维护。 借助 Zep 等工具,它可以在短期记忆和长期记忆之间高效切换,提高了交互质量。
  • 工具集成:借助 LangGraph,LLM 智能体可以轻松与外部服务或数据库协作,获取真实的数据,从而改进应用程序的功能和响应性。
  • 人机协同:除了可以实现自动化外,LangGraph 还可以适应工作流中的人为干预,这对于需要分析监督或伦理考虑的决策过程至关重要。

无论您是在构建具有真实记忆的聊天机器人、交互式故事引擎,还是能够处理复杂问题的智能体团队,LangGraph 都可以将令人头疼的管道工程转变成简单明了、直观的状态机。

开始

要开始使用 LangGraph,您需要进行基本的设置,通常包括安装 langgraph 和 langchain-openai 等必要的库。 然后,您可以定义图中的节点(任务)和边缘(连接),有效地实现短期记忆的检查点,并利用 Zep 满足更持久的记忆需求。

操作 LangGraph 时,请记住以下几点:

  • 具有灵活性的设计:利用强大的图结构来解释并非严格线性的潜在工作流分支和交互。
  • 以深思熟虑的方式与工具交互:利用外部工具增强 LLM 功能,而不是取而代之。 为每个工具提供全面的描述,以实现精确使用。
  • 采用丰富的记忆解决方案:高效地使用记忆库,留意 LLM 的上下文窗口,并考虑集成外部解决方案,以实现自动事实管理。

现在,我们已经介绍 LangGraph 的基础知识,我们来看一个实例。 为此,我们将开发一个用于提供客户支持的 AI 智能体。

这个智能体将接收电子邮件请求,分析电子邮件正文中的问题描述,然后确定请求的优先级和适当的主题/类别/部门。

系好安全带,我们开始吧!

buckle up

首先,我们需要定义什么是“工具”。 可以把它看作是智能体的专属“助理”,使其能够与外部功能进行交互。

@tool 装饰器在这里必不可少。 LangChain 简化了自定义工具的创建,这意味着首先,定义一个 Python 函数,然后应用 @tool 装饰器。

tools

为了进行说明,我们来创建第一个工具。 这个工具将帮助智能体根据电子邮件内容划分 IT 支持工单的优先级:

    from langchain_core.tools import tool
    
    @tool
    def classify_priority(email_body: str) -> str:
        """Classify the priority of an IT support ticket based on email content."""
        prompt = ChatPromptTemplate.from_template(
            """Analyze this IT support email and classify its priority as High, Medium, or Low.
            
            High: System outages, security breaches, critical business functions down
            Medium: Non-critical issues affecting productivity, software problems
            Low: General questions, requests, minor issues
            
            Email: {email}
            
            Respond with only: High, Medium, or Low"""
        )
        chain = prompt | llm
        response = chain.invoke({"email": email_body})
        return response.content.strip()

太棒了! 现在,我们有一个提示,指示 AI 接收电子邮件正文,对其进行分析,并将其优先级分为“高”、“中”或“低”。

就是这样! 您刚刚编写了一个智能体可以调用的工具!

接下来,我们创建一个类似的工具来识别支持请求的主要主题(或类别):


    @tool
    def identify_topic(email_body: str) -> str:
        """Identify the main topic/category of the IT support request."""
        prompt = ChatPromptTemplate.from_template(
            """Analyze this IT support email and identify the main topic category.
            
            Categories: password_reset, vpn, software_request, hardware, email, network, printer, other
            
            Email: {email}
            
            Respond with only the category name (lowercase with underscores)."""
        )
        chain = prompt | llm
        response = chain.invoke({"email": email_body})
        return response.content.strip()

现在,我们需要创建一个状态,在 LangGraph 中,这一小部分非常重要。

把它想象成图的中枢神经系统。 这就是节点之间的通信方式,就像优等生在课堂上传递纸条一样。

文档中显示:

“状态是表示应用程序当前快照的共享数据结构。”

在实践中呢? 状态是在节点之间移动的结构化消息。 它将一个步骤的输出作为下一个步骤的输入。 基本上,它是将整个工作流粘合在一起的粘合剂。

因此,在构建图之前,我们必须先定义我们的状态结构。 本例中,我们的状态包括以下内容:

  • 用户请求(电子邮件正文)
  • 指定的优先级
  • 确定的主题(类别)

它简单明了,因此您可以像专业人士一样浏览图。

    from typing import TypedDict

    # Define the state structure
    class TicketState(TypedDict):
        email_body: str
        priority: str
        topic: str
        
    
    # Initialize state
    initial_state = TicketState(
        email_body=email_body,
        priority="",
        topic=""
    )

节点与 边缘:LangGraph 的关键组成部分

LangGraph 的基本要素包括节点边缘

  • 节点:它们是图中的操作单元,执行实际工作。 节点通常由可以执行任何逻辑(从计算到与语言模型 (LLM) 或外部集成交互)的 Python 代码组成。 从本质上讲,节点就像传统编程中的个别函数或智能体。
  • 边缘:边缘定义节点之间的执行流,决定接下来会发生什么。 它们充当连接器,允许状态根据预定义条件从一个节点转换到另一个节点。 在 LangGraph 中,边缘在协调节点之间的序列和决策流方面至关重要。

为了掌握边缘的功能,我们来看一个消息传递应用程序的简单类比:

  • 节点类似于积极参与对话的用户(或他们的设备)。
  • 边缘代表着用户之间能够促进沟通的聊天主题或连接。

当用户选择一个聊天主题来发送消息时,会有效地创建一个边缘,将他们与另一个用户连接在一起。 与 LangGraph 状态的结构化模式类似,每次交互(无论是发送文本、语音还是视频消息)都遵循预定义的顺序。 它确保了沿边缘传递的数据的一致性和可解释性。

不同于事件驱动型应用程序的动态特性,LangGraph 采用在整个执行过程中保持一致的静态模式。 它简化了节点之间的通信,使开发者可以依赖稳定的状态格式,从而确保无缝的边缘通信。

设计基本工作流

可以将 LangGraph 中的流工程理解为设计一个状态机。 在这个情境中,每个节点代表一个不同的状态或处理步骤,而边缘定义了这些状态之间的转换。 这种方式对想要在 AI 的确定性任务序列与动态决策能力之间取得平衡的开发者特别有用。 我们来使用前面定义的 TicketState 类初始化 StateGraph,开始构建流程。

    from langgraph.graph import StateGraph, START, END
    
    workflow = StateGraph(TicketState)

节点添加:节点是基本要素,用于执行划分工单优先级或识别其主题等特定任务。

每个节点函数均接收当前状态,执行其操作,并返回一个字典以更新状态:

   def classify_priority_node(state: TicketState) -> TicketState:
        """Node to classify ticket priority."""
        priority = classify_priority.invoke({"email_body": state["email_body"]})
        return {"priority": priority}

    def identify_topic_node(state: TicketState) -> TicketState:
        """Node to identify ticket topic."""
        topic = identify_topic.invoke({"email_body": state["email_body"]})
        return {"topic": topic}
        
        
    workflow.add_node("classify_priority", classify_priority_node)
    workflow.add_node("identify_topic", identify_topic_node)

classify_priority_node 和 identify_topic_node 方法将更改 TicketState 并发送参数输入。

边缘创建:定义连接节点的边缘:


    workflow.add_edge(START, "classify_priority")
    workflow.add_edge("classify_priority", "identify_topic")
    workflow.add_edge("identify_topic", END)

classify_priority 确定起点,而 identify_topic 确定到目前为止工作流的终点。

编译与执行:配置节点和边缘后,编译并执行该工作流。


    graph = workflow.compile()
    result = graph.invoke(initial_state)

太好了! 您还可以生成 LangGraph 流的可视化表示。

graph.get_graph().draw_mermaid_png(output_file_path="graph.png")

如果将代码运行到此点,您就会看到一个与下面类似的图:

first_graph.png

这幅图直观地显示了一次顺序执行:开始,然后划分优先级,接着确定主题,最后结束。

LangGraph 最强大的一个方面是它的灵活性,这让我们可以创建更复杂的流程和应用程序。 例如,我们可以修改工作流,使用以下行将 START 中的边缘添加到两个节点:

    workflow.add_edge(START, "classify_priority")
    workflow.add_edge(START, "identify_topic")

这一更改意味着智能体将同时执行 classify_priority 和 identify_topic。

LangGraph 中另一个非常有用的功能是能够使用条件边缘。 它们允许工作流根据对当前状态的评估进行分支,实现任务的动态路由。

我们来增强工作流。 我们将创建一个新工具,分析请求的内容、优先级和主题,以确定它是否为需要上报(例如,为人工团队提交工单)的高优先级问题。 如果不需要,将为用户生成一个自动响应。


    @tool
    def make_escalation_decision(email_body: str, priority: str, topic: str) -> str:
        """Decide whether to auto-respond or escalate to IT team."""
        prompt = ChatPromptTemplate.from_template(
            """Based on this IT support ticket, decide whether to:
            - "auto_respond": Send an automated response for simple/common or medium priority issues
            - "escalate": Escalate to the IT team for complex/urgent issues
            
            Email: {email}
            Priority: {priority}
            Topic: {topic}
            
            Consider: High priority items usually require escalation, while complex technical issues necessitate human review.
            
            Respond with only: auto_respond or escalate"""
        )
        chain = prompt | llm
        response = chain.invoke({
            "email": email_body,
            "priority": priority,
            "topic": topic
        })
        return response.content.strip()
        

此外,如果请求被确定为低优先级或中等优先级(导致“auto_respond”决策),我们将执行矢量搜索来检索历史回答。 然后,将使用此信息来生成适当的自动回答。 不过,这需要两个额外的工具:


    @tool
    def retrieve_examples(email_body: str) -> str:
        """Retrieve relevant examples from past responses based on email_body."""
        try:
            examples = iris.cls(__name__).Retrieve(email_body)
            return examples if examples else "No relevant examples found."
        except:
            return "No relevant examples found."

    @tool
    def generate_reply(email_body: str, topic: str, examples: str) -> str:
        """Generate a suggested reply based on the email, topic, and RAG examples."""
        prompt = ChatPromptTemplate.from_template(
            """Generate a professional IT support response based on:
            
            Original Email: {email}
            Topic Category: {topic}
            Example Response: {examples}
            
            Create a helpful, professional response that addresses the user's concern.
            Keep it concise and actionable."""
        )
        chain = prompt | llm
        response = chain.invoke({
            "email": email_body,
            "topic": topic,
            "examples": examples
        })
        return response.content.strip()

现在,我们为这些新工具定义相应的节点:

    
    def decision_node(state: TicketState) -> TicketState:
        """Node to decide on escalation or auto-response."""
        decision = make_escalation_decision.invoke({
            "email_body": state["email_body"],
            "priority": state["priority"],
            "topic": state["topic"]
        })
        return {"decision": decision}
        
    
    def rag_node(state: TicketState) -> TicketState:
        """Node to retrieve relevant examples using RAG."""
        examples = retrieve_examples.invoke({"email_body": state["email_body"]})
        return {"rag_examples": examples}

    def generate_reply_node(state: TicketState) -> TicketState:
        """Node to generate suggested reply."""
        reply = generate_reply.invoke({
            "email_body": state["email_body"],
            "topic": state["topic"],
            "examples": state["rag_examples"]
        })
        return {"suggested_reply": reply}
        
    
    def execute_action_node(state: TicketState) -> TicketState:
        """Node to execute final action based on decision."""
        if state["decision"] == "escalate":
            action = f"&#x1f6a8; ESCALATED TO IT TEAM\nPriority: {state['priority']}\nTopic: {state['topic']}\nTicket created in system."
            print(f"[SYSTEM] Escalating ticket to IT team - Priority: {state['priority']}, Topic: {state['topic']}")
        else:
            action = f"&#x2705; AUTO-RESPONSE SENT\nReply: {state['suggested_reply']}\nTicket logged for tracking."
            print(f"[SYSTEM] Auto-response sent to user - Topic: {state['topic']}")
        
        return {"final_action": action}
        
        
        
    workflow.add_node("make_decision", decision_node)
    workflow.add_node("rag", rag_node)
    workflow.add_node("generate_reply", generate_reply_node)
    workflow.add_node("execute_action", execute_action_node)

然后,条件边缘将使用 make_decision 节点的输出来定向流:

    workflow.add_conditional_edges(
        "make_decision",
        lambda x: x.get("decision"),
        {
            "auto_respond": "rag",
            "escalate": "execute_action"
        }
    )

如果 make_escalation_decision 工具(通过 decision_node)产生“auto_respond”,工作流将继续通过 RAG 节点(检索示例),然后是 generate_reply 节点(设计回答),最后是 execute_action 节点(记录 auto-response)。

相反,如果决策是“escalate”,流程将绕过 RAG 和生成步骤,直接转到 execute_action 来处理上报。 要添加剩余的标准边缘来完成图,请执行以下操作:

    workflow.add_edge("rag", "generate_reply")
    workflow.add_edge("generate_reply", "execute_action")
    workflow.add_edge("execute_action", END)

数据集注释:对于此项目,我们用于支持检索增强生成 (RAG) 的数据集来自 Hugging Face 上的 Customer Support Tickets 数据集。 对该数据集进行了筛选,以便只包含分类为技术支持并限制为英语的条目。 它确保 RAG 系统只为技术支持任务检索高度相关的特定领域的示例。

此时,我们的图应当与下图类似:

graph.png

当您使用一封电子邮件来执行此图,并导致高优先级分类和“escalate”决策时,您将看到以下响应:

image.png

同时,被分类为低优先级并导致“auto_respond”决策的请求将触发与下面类似的回复:

image.png

那么… 这一路都很顺利吗?

并不完全是。 有一些问题需要注意:

  • 数据隐私:小心敏感信息 — 这些智能体需要防护。
  • 计算成本:某些高级设置需要大量资源。
  • 幻觉:LLM 偶尔也会编造一些内容(不过仍然比大多数实习生聪明)。
  • 非确定性:相同的输入可能会返回不同的输出,这对创造力来说是好事,但对严格的流程来说却很棘手。

不过,大多数缺点都可以通过良好的规划、合适的工具和一点点思考加以控制。

LangGraph 将 AI 智能体从流行语变成实实在在的有效解决方案。 无论您是要自动执行客户支持,处理 IT 工单,还是构建自主应用程序,这个框架都让操作变得可行,甚至有趣。

您有任何问题或反馈吗? 请说出来。 AI 革命需要像您这样的建设者。

0
0 9
InterSystems 官方 Claire Zheng · 十月 23, 2025

InterSystems IRIS® 数据平台、InterSystems IRIS® for HealthTM 和HealthShare® Health Connect 2025.1.2 2024.1.5 维护版本现已全面上市 (GA)。这些版本包括对最近发布的一些警报和建议的修复,其中包括以下内容:

请通过开发者社区分享您的反馈意见,以便我们共同打造更好的产品。

文档

您可以在这些页面上找到详细的变更列表和升级检查列表:

EAP计划

现在有许多 EAP 可用。请查看此页面并注册您感兴趣的项目。

如何获取软件?

0
0 21
文章 Kelly Huang · 十月 23, 2025 15m read

img

在本节中,我们将探讨如何在 IRIS 中使用 Python 作为主要编程语言,在使用 Python 编写应用程序逻辑的同时仍能利用 IRIS 的强大功能。

使用方法 (irispython)

我们先来介绍官方操作方式,即使用 irispython 解释器。

您可以使用 irispython 解释器直接在 IRIS 中运行 Python 代码。 这样,您可以编写 Python 代码,并在 IRIS 应用程序的运行环境中执行相应代码。

什么是 irispython?

irispython 是位于 IRIS 安装目录 (<installation_directory>/bin/irispython) 下的 Python 解释器,用于在 IRIS 的运行环境中执行 Python 代码。

它的功能包括:

  • 设置 sys.path,以包含 IRIS Python 库和模块。
    • 此操作通过 <installation_directory>/lib/python/iris_site.py 中的 site.py 文件执行。
    • 如需了解详情,请参阅模块文章 Python 模块简介
  • 允许您导入 iris 模块,这是一个特殊模块,用于访问 IRIS 功能,例如实现任何 ObjectScript 类与 Python 的双向桥接。
  • 修复权限问题并动态加载 iris 内核库。

irispython 使用示例

您可以通过命令行运行 irispython 解释器:

<installation_directory>/bin/irispython

我们来运行一个简单的示例:

# src/python/article/irispython_example.py
import requests
import iris

def run():
    response = requests.get("https://2eb86668f7ab407989787c97ec6b24ba.api.mockbin.io/")

    my_dict = response.json()

    for key, value in my_dict.items():
        print(f"{key}: {value}")  # print message: Hello World

    return my_dict

if __name__ == "__main__":
    print(f"Iris version: {iris.cls('%SYSTEM.Version').GetVersion()}")
    run()

您可以使用 irispython解释器运行此脚本:

<installation_directory>/bin/irispython src/python/article/irispython_example.py

您将看到如下输出:

Iris version: IRIS for UNIX (Ubuntu Server LTS for x86-64 Containers) 2025.1 (Build 223U) Tue Mar 11 2025 18:23:31 EDT
message: Hello World

此例展示了如何使用 irispython 解释器在 IRIS 的运行环境中执行 Python 代码。

优点

  • Python 优先:您可以使用 Python 编写应用程序逻辑,这样,您可以利用 Python 的功能和库。
  • IRIS 集成:您可以轻松将 Python 代码与 IRIS 功能相集成。

缺点

  • 调试受限:在 irispython 中调试 Python 代码并不像在专用 Python 环境中那样简单直接。
    • 这并不是说无法进行调试,而是并不像在专用 Python 环境中那样简单。
    • 如需了解详情,请参阅补充部分
  • 虚拟环境:在 irispython 中为 Python 代码搭建虚拟环境比较困难。
    • 这并不是说无法搭建,只是操作起来比较困难。因为默认情况下,虚拟环境会查找名为 pythonpython3 的解释器,而 IRIS 中的情况并非如此。
    • 如需了解详情,请参阅补充部分

结论

总的来说,使用 irispython 解释器让您既可以利用 Python 编写应用程序逻辑,又能利用 IRIS 的强大功能。 不过,这种方式也存在调试和虚拟环境搭建方面的限制。

使用 WSGI

在本节中,我们将探讨如何使用 WSGI(Web 服务器网关接口)在 IRIS 中运行 Python Web 应用程序。

WSGI 是 Web 服务器与 Python Web 应用程序或框架之间的标准接口。 利用 WSGI,您可以在 Web 服务器环境中运行 Python Web 应用程序。

IRIS 支持 WSGI,这意味着您可以在 IRIS 中使用内置的 WSGI 服务器运行 Python Web 应用程序。

使用方法

要在 IRIS 中使用 WSGI,您需要创建 WSGI 应用程序,并向 IRIS Web 服务器注册此应用程序。

如需了解详情,请参阅官方文档

WSGI 使用示例

有关完整模板,请参见此处:iris-flask-example

优点

  • Python Web 框架:您可以使用流行的 Python Web 框架(如 Flask 或 Django)来构建 Web 应用程序。
  • IRIS 集成:您可以轻松将 Python Web 应用程序与 IRIS 功能相集成。

缺点

  • 复杂程度:构建 WSGI 应用程序会比直接在 Python Web 框架中使用 uvicorngunicorn 复杂一些。

结论

总的来说,在 IRIS 中使用 WSGI 让您既可以利用 Python 构建功能强大的 Web 应用程序,又能利用 IRIS 的功能。

DB-API

在本节中,我们将探讨如何使用 Python DB-API 与 IRIS 数据库进行交互。

Python DB-API 是 Python 中用于连接数据库的标准接口。 利用此接口,您可以执行 SQL 查询,并从数据库中检索结果。

使用方法

您可以使用 pip 进行安装:

pip install intersystems-irispython

随后,您可以使用 DB-API 连接 IRIS 数据库并执行 SQL 查询。

DB-API 使用示例

它的使用方法与其他所有 Python DB-API 相同,示例如下:

# src/python/article/dbapi_example.py
import iris

def run():
    # Connect to the IRIS database
# Open a connection to the server
    args = {
        'hostname':'127.0.0.1', 
        'port': 1972,
        'namespace':'USER', 
        'username':'SuperUser', 
        'password':'SYS'
    }
    conn = iris.connect(**args)

    # Create a cursor
    cursor = conn.cursor()

    # Execute a query
    cursor.execute("SELECT 1")

    # Fetch all results
    results = cursor.fetchall()

    for row in results:
        print(row)

    # Close the cursor and connection
    cursor.close()
    conn.close()
if __name__ == "__main__":
    run()

您可以使用任何 Python 解释器运行此脚本:

python3 /irisdev/app/src/python/article/dbapi_example.py

您将看到如下输出:

(1,)

优点

  • 标准接口:DB-API 提供用于连接数据库的标准接口,因此可以轻松切换不同的数据库。
  • SQL 查询:您可以使用 Python 执行 SQL 查询,并从数据库检索结果。
  • 远程访问:您可以使用 DB-API 连接到远程 IRIS 数据库。

缺点

  • 功能有限:DB-API 仅可通过 SQL 访问数据库,因此,您无法使用高级 IRIS 数据库功能,如执行 ObjectScript 或 Python 代码。

备选方案

还提供社区版 DB-API,参见此处:intersystems-irispython-community

该版本能更好地支持 SQLAlchemy、Django、langchain,以及其他使用 DB-API 的 Python 库。

如需了解详情,请参阅 补充部分

结论

总的来说,将 Python DB-API 与 IRIS 结合使用能够让您构建功能强大的应用程序,实现与数据库的无缝交互。

Notebook

现在,我们已了解如何在 IRIS 中使用 Python,接下来我们将探讨如何将 Jupyter Notebooks 与 IRIS 结合使用。

Jupyter Notebooks 是交互式编写和执行 Python 代码的绝佳方式,并且可与 IRIS 结合使用,以充分利用 IRIS 的功能。

使用方法

要在 IRIS 中使用 Jupyter Notebooks,您需要安装 notebookipykernel 这两个软件包:

pip install notebook ipykernel

然后,您可以创建新的 Jupyter Notebook 并选择 Python 3 内核。

Notebook 使用示例

您可以创建新的 Jupyter Notebook 并编写以下代码:

# src/python/article/my_notebook.ipynb
# Import the necessary modules
import iris
# Do the magic
iris.system.Version.GetVersion()

您可以使用 Jupyter Notebook 运行此 notebook:

jupyter notebook src/python/article/my_notebook.ipynb

优点

  • 交互式开发:利用 Jupyter Notebooks,您可以交互式编写和执行 Python 代码,非常适合数据分析和探索。
  • 丰富的输出:您可以直接在 Notebook 中显示丰富的输出,如图表和表格。
  • 文档:您可以在代码旁添加文档和说明。

缺点

  • 设置有难度:设置将 Jupyter Notebooks 与 IRIS 结合使用存在一定的难度,特别是对于内核配置而言。

结论

总的来说,将 Jupyter Notebooks 与 IRIS 结合使用可以交互式编写和执行 Python 代码,同时利用 IRIS 的功能。 不过,设置起来存在一定的难度,特别是对于内核配置而言。

补充部分

从本节开始,我们将探讨一些与在 IRIS 中使用 Python 相关的高级主题,例如远程调试 Python 代码、使用虚拟环境等。

以下大部分主题均未获得 InterSystems 的官方支持,但如果您要在 IRIS 中使用 Python,了解相关内容会提供很大的帮助。

使用原生解释器(无 irispython

在本节中,我们将探讨如何使用原生 Python 解释器代替 irispython 解释器。

这样一来,您可以直接使用虚拟环境,并使用您习惯的 Python 解释器。

使用方法

要使用原生 Python 解释器,您需要在机器本地安装 IRIS,并需要安装 iris-embedded-python-wrapper 软件包。

您可以使用 pip 进行安装:

pip install iris-embedded-python-wrapper

接下来,您需要设置一些环境变量指向 IRIS 安装目录:

export IRISINSTALLDIR=<installation_directory>
export IRISUSERNAME=<username>
export IRISPASSWORD=<password>
export IRISNAMESPACE=<namespace>

然后,您可以使用您的原生 Python 解释器运行 Python 代码:

python3 src/python/article/irispython_example.py
# src/python/article/irispython_example.py
import requests
import iris

def run():
    response = requests.get("https://2eb86668f7ab407989787c97ec6b24ba.api.mockbin.io/")

    my_dict = response.json()

    for key, value in my_dict.items():
        print(f"{key}: {value}")  # print message: Hello World

    return my_dict

if __name__ == "__main__":
    print(f"Iris version: {iris.cls('%SYSTEM.Version').GetVersion()}")
    run()

如需了解详情,请参阅 iris-embedded-python-wrapper 文档

优点

  • 虚拟环境:您可以将虚拟环境与原生 Python 解释器结合使用,从而可以更加轻松地管理依赖项。
  • 熟悉的工作流:您可以使用习惯的 Python 解释器,从而可以更轻松地与现有工作流相集成。
  • 调试:可以使用您喜欢的 Python 调试工具(如 pdbipdb)在 IRIS 中调试 Python 代码。

缺点

  • 设置的复杂程度:设置环境变量和 iris-embedded-python-wrapper 软件包可能会比较复杂,特别是对于初学者来说。
  • 未获官方支持:此方式未获 InterSystems 的官方支持,因此您可能遇到文档中未记录或不受支持的问题。

DB-API 社区版

在本节中,我们将探讨 GitHub 上提供的社区版 DB-API。

使用方法

您可以使用 pip 进行安装:

pip install sqlalchemy-iris

此代码将安装社区版 DB-API。

或使用特定版本:

pip install https://github.com/intersystems-community/intersystems-irispython/releases/download/3.9.3/intersystems_iris-3.9.3-py3-none-any.whl

然后,您可以使用 DB-API 连接 IRIS 数据库,并执行 SQL 查询或其他任何使用 DB-API 的 Python 代码,如 SQLAlchemy、Django、langchain、pandas 等。

DB-API 使用示例

它的使用方法与其他所有 Python DB-API 相同,示例如下:

# src/python/article/dbapi_community_example.py
import intersystems_iris.dbapi._DBAPI as dbapi

config = {
    "hostname": "localhost",
    "port": 1972,
    "namespace": "USER",
    "username": "_SYSTEM",
    "password": "SYS",
}

with dbapi.connect(**config) as conn:
    with conn.cursor() as cursor:
        cursor.execute("select ? as one, 2 as two", 1)   # second arg is parameter value
        for row in cursor:
            one, two = row
            print(f"one: {one}")
            print(f"two: {two}")

您可以使用任何 Python 解释器运行此脚本:

python3 /irisdev/app/src/python/article/dbapi_community_example.py

也可以使用 sqlalchemy:

from sqlalchemy import create_engine, text

COMMUNITY_DRIVER_URL = "iris://_SYSTEM:SYS@localhost:1972/USER"
OFFICIAL_DRIVER_URL = "iris+intersystems://_SYSTEM:SYS@localhost:1972/USER"
EMBEDDED_PYTHON_DRIVER_URL = "iris+emb:///USER"

def run(driver):
    # Create an engine using the official driver
    engine = create_engine(driver)

    with engine.connect() as connection:
        # Execute a query
        result = connection.execute(text("SELECT 1 AS one, 2 AS two"))

        for row in result:
            print(f"one: {row.one}, two: {row.two}")

if __name__ == "__main__":
    run(OFFICIAL_DRIVER_URL)
    run(COMMUNITY_DRIVER_URL)
    run(EMBEDDED_PYTHON_DRIVER_URL)

您可以使用任何 Python 解释器运行此脚本:

python3 /irisdev/app/src/python/article/dbapi_sqlalchemy_example.py

您将看到如下输出:

one: 1, two: 2
one: 1, two: 2
one: 1, two: 2

优点

  • 更好的支持:对 SQLAlchemy、Django、langchain 以及其他使用 DB-API 的 Python 库提供更好的支持。
  • 依托于社区:它由社区维护,这意味着随着时间的推移,可能会对其进行更新和改进。
  • 兼容性:它兼容官方 InterSystems DB-API,因此您可以在官方版与社区版之间轻松切换。

缺点

  • 速度:社区版的优化程度可能不如正式版高,某些场景下可能会导致速度变慢。

在 IRIS 中调试 Python 代码

在本节中,我们将探讨如何在 IRIS 中调试 Python 代码。

默认情况下,无法在 IRIS 中调试 Python 代码(在包含语言标签或 %SYS.Python 的 objectscript 中),但可以通过社区解决方案在 IRIS 中调试 Python 代码。

使用方法

先安装 IoP 基于 Python 的互操作性

pip install iris-pex-embedded-python
iop --init

此代码将安装 IoP 和新的 ObjectScript 类,以便您可以在 IRIS 中调试 Python 代码。

然后,您可以使用 IOP.Wrapper 类包装 Python 代码并实现调试。

Class Article.DebuggingExample Extends %RegisteredObject
{
ClassMethod Run() As %Status
{
    set myScript = ##class(IOP.Wrapper).Import("my_script", "/irisdev/app/src/python/article/", 55550) // Adjust the path to your module
    Do myScript.run()
    Quit $$$OK
}
}

然后,向 launch.json 文件添加以下配置,将 VsCode 配置为使用 IoP 调试器:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python in IRIS",
            "type": "python",
            "request": "attach",
            "port": 55550,
            "host": "localhost",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}/src/python/article",
                    "remoteRoot": "/irisdev/app/src/python/article"
                }
            ]
        }
    ]
}

现在,您可以运行用于导入 Python 模块的 ObjectScript 代码,然后将 VsCode 中的调试器关联到端口 55550

您可以使用以下命令运行此脚本:

iris session iris -U IRISAPP '##class(Article.DebuggingExample).Run()'

然后,您可以在 Python 代码中设置断点,调试器将在这些断点处停止执行,以便您检查变量并单步执行代码。

远程调试实际运作视频(针对 IoP,但原理是相同的):

Python 代码中还提供回溯信息,这对调试非常有用。

启用回溯时:

Traceback enabled

禁用回溯时:

Traceback disabled

优点

  • 远程调试:您可以远程调试在 IRIS 中运行的 Python 代码,在我看来,这是一项革命性的功能。
  • Python 调试功能:您可以使用所有 Python 调试功能,例如断点、变量检查和单步执行代码。
  • 回溯:您可以看到 Python 代码中错误的完整回溯信息,这对调试非常有用。

缺点

  • 设置的复杂程度:设置 IoP 和调试器可能会比较复杂,特别是对于初学者来说。
  • 社区解决方案:该解决方案属于社区解决方案,因此可能不像官方解决方案那样稳定,文档也可能不完善。

结论

总的来说,在 IRIS 中调试 Python 代码可以通过 IoP 社区解决方案来实现,借助该解决方案,您可以使用 Python 调试器调试在 IRIS 中运行的 Python 代码。 不过,此解决方案需要执行一些设置操作,并可能不像官方解决方案一样稳定。

IoP(基于 Python 的互操作性)

在本节中,我们将探讨 IoP(基于 Python 的互操作性)解决方案,利用该解决方案,您可以使用 Python 优先的方式在 IRIS 中运行 Python 代码。

我开发这个解决方案已经有一段时间了,可以说它是我的心血之作,该解决方案尝试解决或改善我们在本系列文章中提到的所有问题。

IoP 的要点:

  • Python 优先:您可以使用 Python 编写应用程序逻辑,这样,您可以利用 Python 的功能和库。
  • IRIS 集成:您可以轻松将 Python 代码与 IRIS 功能相集成。
  • 远程调试:您可以远程调试在 IRIS 中运行的 Python 代码。
  • 回溯:您可以看到 Python 代码中错误的完整回溯信息,这对调试非常有用。
  • 虚拟环境:支持虚拟环境功能,因此您可以更加轻松地管理依赖项。

要详细了解 IoP,您可以查阅官方文档

然后,您可以阅读以下文章详细了解 IoP:

🐍❤️如您所见,通过 IoP 这一功能强大的方法,我们可以将 Python 与 IRIS 相集成,从而可以更轻松地开发和调试应用程序。

您无需继续使用 irispython,也不必手动设置 sys.path,而是可以使用虚拟环境,并且可以调试在 IRIS 中运行的 Python 代码。

结论

希望大家喜欢这一系列关于在 IRIS 中使用 Python 的文章。

如果您对这一系列的文章有任何疑问或反馈,请随时联系我。

祝您在 IRIS 中使用 Python 时一切顺利!

0
0 18
文章 Claire Zheng · 九月 23, 2025 2m read

大家好! 我最近才加入 InterSystems,但发现尽管我们推出了完全免费且出色的社区版,但大家并不是十分清楚如何获取。 因此我决定编写一份指南,详细介绍获取 InterSystems IRIS 社区版的所有不同方式:

以容器形式获取 InterSystems IRIS 社区版

对于刚刚接触 InterSystems IRIS 开发的伙伴,推荐使用社区版的容器化实例,在我看来,这是最简单直接的方式。 InterSystems IRIS 社区版可以在 DockerHub 上获取;如果您有 InterSystems SSO 帐户,还可以在 InterSystems 容器注册表中获取。

在这两种情况下,您都需要使用 docker CLI 拉取所需镜像:

docker pull intersystems/iris-community:latest-em
// or
docker pull containers.intersystems.com/intersystems/iris-community:latest-em

接下来,您需要启动容器:要从容器外部与 IRIS 进行交互(例如使用管理门户),您需要发布一些端口。 以下命令将运行 IRIS 社区版容器,并发布超级服务器和 Web 服务器端口;请注意,此时不能运行其他依赖 1972 或 52773 端口的程序!

docker run --name iris -d --publish 1972:1972 --publish 52773:52773 intersystems/iris-community:latest-em

在云端获取 InterSystems IRIS 社区版

您可能想要完全避免本地安装的一系列操作,如果是这种情况,您可以借助 InterSystems IRIS 社区版的云部署实现环境搭建和运行。 所有主流云提供商均受支持;有关详细信息,请参阅我们的云合作伙伴页面。 本例将重点介绍如何在 AWS 上部署。

先在 AWS Marketplace 中找到 InterSystems IRIS 社区版:

您可以点击“查看购买选项”,并登录您的帐户查看订阅页面:

 

向下滚动,点击“订阅”,填写必填信息,然后点击“部署”,将 IRIS 社区版部署为云节点! 有关详细信息,请参阅我们关于将 InterSystems IRIS 部署到云端的文档。

以安装套件形式获取 InterSystems IRIS 社区版

如果您倾向于将 InterSystems IRIS 直接安装到自己的机器上使用,且不想处理容器,可从 InterSystems 评估服务下载适合您系统的安装套件。要下载安装套件,您需要有 InterSystems SSO 登录帐户;但好消息是,如果您有开发者社区帐户,就说明您已有 InterSystems SSO 帐户! 如果您没有此帐户,可以点击“注册新帐户”并完成后续步骤:

登录后,您应会看到以下页面;点击“下载社区版”开始下载安装套件:

 

系统将提示您填写关于所需 InterSystems IRIS 的具体版本和安装平台的信息:

 

对于大部分用例,您需要选择“InterSystems IRIS 社区版”以及您的平台可用的最新版本。 同意《服务条款》后,您便可下载安装套件! 按照平台特定文档中的安装说明进行操作,一切就搞定啦!

0
0 29
文章 Lilian Huang · 九月 19, 2025 5m read

image

您知道当您拿到验血结果时一切看起来都像天书的那种感觉吗? 这就是 FHIRInsight 要解决的问题。 它最初的理念是,医疗数据不应该令人恐惧或困惑 – 它应该是我们所有人都能使用的东西。 验血是健康检查中十分常见的检查,但说实话,大多数人都很难理解它们,有时甚至对不擅长实验室工作的医务人员来说也是如此。 FHIRInsight 希望整个过程能够变得更简单,信息更富有实用价值。

FHIRInsight logo

🤖我们为什么要构建 FHIRInsight

这一切都始于一个简单而有力的问题:

“为什么验血结果仍然很难读懂 — 有时甚至对医生来说也是如此?”

如果您看过化验结果,您可能会看到一大堆数字、隐晦的缩写和“参考范围”,这些可能适用于您的年龄、性别或身体状况,也可能不适用。 毫无疑问,它是一种诊断工具,但如果没有背景信息,它就变成了一个猜谜游戏。 即使是经验丰富的医疗保健专业人员有时也需要交叉参考指导方针、研究论文或专家意见才能理解所有内容。

这正是 FHIRInsight 的用武之地。

我们不只是为患者而构建,也为一线医护人员而构建。 为轮流值班的医生,为捕捉生命体征细微变化的护士,为每一位试图在有限的时间和巨大的责任下做出正确决定的医护人员而构建。 我们的目标是让他们的工作简单一点,将密集的临床 FHIR 数据转化为清晰、有用、以真正的医学科学为基础的东西, 讲人类语言的东西。

FHIRInsight 不仅仅是解释化验结果。 它还:

  • 提供化验结果是轻度、中度还是重度的情境建议
  • 根据临床症状提出潜在病因和鉴别诊断
  • 提出下一步行动建议 — 是后续检查、转诊还是紧急护理
  • 利用 RAG(检索增强生成)拉取相关科学文章,为分析提供支持

想象一下,一位年轻的医生正在查看患者的贫血检查结果。 他们不需要在 Google 上搜索每一个异常值或翻阅医学期刊,而是收到一份报告,上面不仅总结了问题,还引用了最近的研究或世界卫生组织的指导方针来支持这一推理。 这就是将 AI针对精选研究的矢量搜索相结合的力量。

那患者呢?

他们再也不用盯着满屏的数字,猜想“胆红素 2.3 mg/dL”是什么意思,或者他们是否应该担心了。 他们会得到简单、周全的解释。 感觉更像是一场对话,而不是一份临床报告。 一些他们能真正理解的东西 — 并与他们的医生进行讨论,让人感觉更有准备,不那么焦虑。

因为这就是 FHIRInsight 的真正意义**:将复杂的医疗数据转化为清晰的见解**,帮助医疗保健专业人员和患者共同制定更好、更自信的决策

🔍 表象之下

当然,所有这些表面上的简单,背后可能由一些默默运行的强大技术提供支持。

以下是 FHIRInsight 的构建基础:

  • FHIR (Fast Healthcare Interoperability Resources) — 这是健康数据的全球标准。 它是我们接收化验结果、患者病史、受众特征和诊疗等结构化信息的方式。 FHIR 是医疗系统使用的语言,我们将这种语言翻译成人们可以真正使用的东西。
  • RAG(检索增强生成)的矢量搜索:FHIRInsight 通过在使用 InterSystems IRIS 原生矢量搜索的矢量数据库中建立科学 PDF 论文和可信 URL 索引,增强其诊断推理能力。 当化验结果看起来模棱两可或差别细微时,系统会检索相关内容来支持其建议,它不是从记忆库中进行检索,而是从真实的、最新的研究中进行检索。
  • 医学推理提示工程:我们对提示进行了微调,以指导 LLM 识别各种血液相关疾病。 无论是缺铁性贫血、凝血功能障碍、激素失衡还是自身免疫触发因素,提示都会引导 LLM 了解症状、检验室模式和可能病因的变化。
  • LiteLLM 集成:自定义适配器通过统一的接口将请求路由到多个 LLM 提供程序(OpenAI、Anthropic、Ollama 等),从而轻松实现回退、流式传输和模型切换。

无论您是查看 30 个患者图表的医生,还是想要理解数字含义的患者,都可以在几秒钟内将原始的化验数据转化为可解释、富有实用价值的医学见解

🧩 创建 LiteLLM 适配器:使用一个接口管理所有模型

在后台,FHIRInsight 的 AI 赋能报告由 LiteLLM 驱动,后者是一个出色的抽象层,可以使我们通过一个 OpenAI 风格的界面调用 100 多个 LLM(OpenAI、Claude、Gemini、Ollama 等)。

但是要想将 LiteLLM 集成到 InterSystems IRIS 中,需要比隐藏在业务操作中的 Python 脚本更持久、更能重复使用的东西。 所以,我们创建了自己的 LiteLLM 适配器

认识 LiteLLMAdapter

此适配器类可以处理您希望从一个强大的 LLM 集成中获得的所有东西:

  • 接受 promptmodeltemperature 等参数
  • 动态加载环境变量(例如,API 密钥)

为了将其嵌入我们的互操作性生产中,我们将其包装在一个专门的业务操作中:

  • 通过标准的 LLMModel 设置处理生产配置
  • 与 FHIRAnalyzer 组件集成,以实时生成报告
  • 作为未来任何需要访问 LLM 的组件的中心“AI 桥”

以下是简化的核心流程:

set response = ##class(dc.LLM.LiteLLMAdapter).CallLLM("Tell me about hemoglobin.", "openai/gpt-4o", 0.7)
write response

🧭 结语

当我们开始构建 FHIRInsight 时,我们的使命很简单**:让验血结果对每个人来说都更容易理解**。 不仅仅是患者,还有医生、护士、护理人员… 任何曾经盯着化验结果苦思冥想的人,“好吧,这到底是什么意思?”

我们都有过这样的经历。

通过融合 FHIR 的结构、InterSystems IRIS 的速度、LLM 的智能,以及通过矢量搜索实现真实医学研究的深度,我们创造了一个可以将令人困惑的数字转化成有意义的叙述的工具。 帮助人们对自己的健康做出更明智的决定,甚至可能及早发现一些被忽视的疾病。

但 FHIRInsight 不仅仅与数据相关。 它还与我们查看数据时的感受相关。 我们希望它给人一种清晰、支持和赋能的感觉。 我们希望这种体验… 有点像**“氛围编程”医疗保健** — 在智能的代码、优秀的设计和人类同理心方面达到最佳平衡点。

我们希望您能尝试它,打破它,质疑它,并帮助我们改进它。

告诉我们您接下来想看到什么。 更多条件? 更具可解释性? 更加个性化?

这只是一个开端 — 我们希望您能帮助塑造它的未来。

0
0 30
文章 Claire Zheng · 八月 29, 2025 2m read

8月29日14:00,我们邀请了InterSystems高级销售工程师 @Nicky Zhu (祝麟)分享了“以医疗 AI 枢纽构建智能协同生态”话题,聚焦 “医疗 AI 枢纽” 建设,以 InterSystems IRIS 为核心,深度解析医疗 AI 面临的核心挑战 —— 从开放数据可用性、研究可及性到部署基础设施瓶颈,结合国际电信联盟(ITU)AI 就绪框架,剖析行业痛点。

关于该主题详情,欢迎查看这篇帖子

直播回放现已准备就绪,欢迎👉点击查看!(如您未注册过,需要注册后观看)

0
0 44
文章 Claire Zheng · 八月 25, 2025 1m read

2025年7月25日,我们邀请了InterSystems销售工程师 @Kate Lau 分享了关于“InterSystems FHIR to OMOP数据管道”的内容。

如果说FHIR是数据资产化的“起点”,通过实时交换和标准化接口,将分散的医疗数据转化为可流通的资产;那么OMOP就是科研价值的“终点”,通过标准化模型和工具链,挖掘数据资产中的知识,支撑临床决策和药物研发。从FHIR到OMOP,灵活的转换能够有效推动数据资产的应用落地。

InterSystems FHIR to OMOP数据管道提供了解决方案。通过标准互操作(基于FHIR R4标准构建数据接口)、自动化映射(内置OMOP CDM预构建映射规则,大大缩短传统ETL开发周期)、 自动化数据质量分析和云原生架构(依托AWS HealthLake实现弹性扩展),可以帮助用户快速实现数据资产的OMOP化,为用户在数字时代占据先机!

关于该主题详情,欢迎查看这篇帖子

直播回放现已准备就绪,欢迎查看!(如您未注册过,需要注册后观看)

0
0 45
文章 Louis Lu · 十二月 25, 2024 2m read

IRIS 2024.2 版本包含一项变更(DP-432503),该变更要求Web Gateway最初连接到 IRIS 时所使用的用户(通常是 CSPSystem)必须对承载 REST web applicatioon 的dispatch类的数据库具备 READ 权限。

在不满足该条件的情况下,就会引发一个错误,这会向调用者返回一个 HTTP 404 状态码,而非预期的 HTTP 401 状态码。

显然,这个问题将在 2024.3 版本中修复,参考编号为 DP-432898 / ALI048:REST 登录端点将返回 401 HTTP 错误码而非 404,但作为持续交付(CD)版本,2024.2 不会获得维护版本修正。

解决方法是让 CSPSystem 用户对安装WebTerminal所在命名空间的数据库具备读权限。

下面是所需的步骤:

1. 创建一个新的资源 “%DB_WEBTERMINAL”,并设置 “WEBTERMINAL” 数据库使用该资源,而非 “%DB_% DEFAULT”。

2. 创建一个名为 “% DB_WEBTERMINAL” 的角色,该角色能让角色持有者对 “% DB_WEBTERMINAL” 资源具有读写(RW)访问权限。

3. 再创建另一个角色(我将其命名为 “DBread_WEBTERMINAL”),该角色仅赋予角色持有者对该资源的读(R)访问权限。

2
0 105
InterSystems 官方 Claire Zheng · 七月 29, 2025

InterSystems IRIS 2025.2 引入了 IRISSECURITY 数据库,用于存储安全数据。 与之前用于存储安全数据的数据库 IRISSYS 不同,IRISSECURITY 支持加密,可以保护静态敏感数据。 在今后的版本中,IRISSECURITY 将可实现镜像。

此版本还引入了可以执行常规安全管理任务的 %SecurityAdministrator 角色。

本文中介绍的更改将影响持续交付 (CD) 和扩展维护 (EM) 版本通道。 也就是说,从版本 2025.2(CD,于 2025 年 7 月 23 日发布)和 2026.1 (EM) 开始,InterSystems IRIS 将包含 IRISSECURITY 数据库,并且在升级时,所有安全数据会自动从 IRISSYS 迁移到 IRISSECURITY。

虽然 InterSystems IRIS 2025.2 预计于 2025 年 7 月 23 日发布,但我们暂缓了 InterSystems IRIS for Health 和 HealthShare Health Connect 2025.2 的公开发布,原因是我们正在着手完成针对已知镜像问题的修复计划,该问题会影响 OAuth 配置数据。

升级须知

IRISSECURITY 对用户与安全数据的交互方式做出了多处可能导致功能中断的更改:

0
0 58
问题 Alan Zheng · 七月 16, 2025

大家好,

从 Ensemble 2018 转换到 IRIS 2024 以后,为什么HTML标签无法识别?

在Ensemble 里没问题, 但是从Ensemble复制粘贴到IRIS 以后就出问题

谢谢

1
0 46
InterSystems 官方 Claire Zheng · 七月 21, 2025

在 InterSystems,我们相信负责任地披露最近发现的安全漏洞。我们向客户提供及时的信息,同时防止信息落入可能滥用信息的人之手。我们还了解每个客户在解决安全问题方面都有不同的要求。

从 2023 年开始,我们对安全漏洞修复方法进行了两项重大更改,我想强调一下:

  1. 安全漏洞补丁将包含在每个版本中
  2. 改进客户通知

每个版本中的安全漏洞补丁
现在,每个版本都可能包含针对安全漏洞的补丁,而不是等待在安全版本中提供补丁。我们改进的发布节奏将及时向现场提供补丁。

改进客户通知
中低影响项目(通常包括侦察攻击或跨站点脚本攻击等漏洞)将包含在每个版本中,并在产品发布说明中进行描述。

更高严重性项目的修复也将包含在每个版本中,因为它们已准备就绪,但有关修复的信息将被禁运,直到补丁包含在所有受支持的版本中。

当所有受支持的版本中都已修复这些问题时,将针对高严重性和严重性问题发布安全警报。

为什么 InterSystems 做出这些改变?
我们相信这些改进将:

  1. 更快地为我们的客户获取安全补丁
  2. 帮助专注于最严重的修复
  3. 在某些情况下,可以将安全修复程序作为补丁而不是完整的工具包提供
  4. 通过按安全影响对漏洞进行分组,提高安全漏洞管理方式的透明度
  5. 允许系统管理员根据他们的需要和要求应用更多修复
0
0 63
InterSystems 官方 Claire Zheng · 七月 7, 2025

InterSystems 发布了新的点式更新,该更新解决的缺陷问题影响以下受支持的产品线的最新先前版本 2025.1.0、2024.1.4、2023.1.6 和 2022.1.7:

  • InterSystems IRIS
  • InterSystems IRIS for Health
  • HealthShare Health Connect

此问题可能导致在使用以下功能时出现意外的 <PROTECT> 错误或访问异常:

  • 隐式命名空间
  • 对数据库的混合只读/读写访问
  • 用于列出例程和全局变量的管理门户页面

症状包括:

  • 命名空间创建故障
  • 在列出例程时,间歇性出现“访问被拒”错误
  • 对于具有只读权限的用户,全局显示页面不返回数据

虽然这些问题并影响访问控制或用户权限,但它们会在多种场景下影响预期的系统行为。

问题得到解决的版本

以下点式版本中修复了该问题:

  • 2025.1.0.230.2
  • 2024.1.4.516.1
  • 2023.1.6.810.1
  • 2022.1.7.116.1

建议使用受影响版本的客户应用相关更新,以确保系统正常运行。

如果您有任何问题或需要支持,请联系 InterSystems 全球响应中心 (WRC)

0
0 48
InterSystems 官方 Claire Zheng · 七月 7, 2025

摘要

公告编号 受影响的产品和版本 风险类别和评分 明确要求

DP-439649

产品:

  • InterSystems IRIS®
  • InterSystems IRISfor Health
  • HealthShare®Health Connect

版本:

  • 2025.1.0.225.1
  • 2025.1.0.223.0
  • 2024.1.4
  • 2023.1.6
  • 2022.1.7

操作:
4 – 高风险

系统稳定性:
3 – 中等风险

此问题构成安全漏洞。 它允许用户绕过权限检查或访问其授权命名空间之外的数据

使用隐含命名空间、管理门户或数据库读写/只读混合访问权限

在命名空间之间切换或使用以下任何功能访问环境中的全局变量时,上面列出的 InterSystems 产品中的问题可能会引发意外的 <PROTECT>错误

  • 隐含命名空间
  • 只读访问默认数据库,但读写访问其他地方
  • 列出例程和全局项的管理门户页面

该问题的症状包括:

  • 存在命名空间创建故障 (DP-440830)
  • 在管理门户中列出例程时,间歇性出现访问被拒的情况 (DP-439622)
  • 全局显示实用工具不显示全局变量(如果用户只有只读权限)(DP-440744)
0
0 53
InterSystems 官方 Claire Zheng · 六月 23, 2025

您好!

我们正在为即将推出的表分区功能发起抢先体验计划,该功能将帮助 IRIS 客户管理非常大的表,并在数据库和存储层之间分配行数据和关联索引。表分区将深入 IRIS 关系数据管理的核心,为了确保我们的工作顺利开展,我们将与一些积极参与的客户合作,希望他们能够对最初的交付成果提供反馈,我们将根据需要对该功能进行细微调整。

如果您正在使用非常大的关系数据集,想要提高操作效率并愿意参与测试新功能,请https://www.intersystems.com/early-access-program/ 上注册。 您将收到一封欢迎电子邮件,并可通过该电子邮件转到评估门户,在那里可以找到临时开发许可证、最近的工具包、包含新功能的容器镜像,以及入门教程

我们会定期联系注册的参与者,以分享相关更新,当然,如果需要,我们也可以直接协助您进行探索。

谢谢!
Benjamin

0
0 60
InterSystems 官方 Claire Zheng · 六月 22, 2025

适用于 InterSystems IRIS® 数据平台InterSystems IRIS® for HealthTMHealthShare® Health Connect 的维护版本 2024.1.42023.1.6 现已正式发布 (GA)。 这些版本包含对最近发布的以下提醒的修复 - 提醒:SQL 查询返回错误结果 | InterSystems。 请通过开发者社区分享您的反馈,以便我们可以共同打造更出色的产品。

文档

您可以在以下页面上找到详细的变更列表和升级核对清单:

抢先体验计划 (EAP)

目前提供多个 EAP。 请查看此页面并注册您感兴趣的 EAP。

如何获取软件?

InterSystems IRIS 和 InterSystems IRIS for Health 的完整安装包可以从本 WRC 的 InterSystems IRIS 数据平台完整工具包页面 获取。 HealthShare Health Connect 工具包可以从 WRC 的 HealthShare 完整工具包页面获取。 容器镜像可以从 InterSystems 容器注册表中获取。

可用性和软件包信息

此版本提供了适用于所有受支持平台的经典安装包,以及 Docker 容器格式的容器镜像。有关完整列表,请参阅“支持的平台”文档。 这些维护版本的内部版本号为:2024.1.4.512.02023.1.6.809.0

0
0 46
InterSystems 官方 Claire Zheng · 六月 20, 2025

InterSystems 宣布 InterSystems IRIS、InterSystems IRIS for Health 和 HealthShare Health Connect 2025.1 正式发布

2025.1 版的 InterSystems IRIS® 数据平台、InterSystems IRIS® for HealthTMHealthShare® Health Connect 现已正式发布 (GA)。 这是扩展维护 (EM) 版本。

版本亮点

在这个激动人心的版本中,用户可以期待一些新功能和增强,包括:

  1. 高级向量搜索功能
  2. 增强的商业智能
    • IRIS BI 多维数据集构建和同步中的自动依赖项分析,确保复杂多维数据集依赖项中的一致性和完整性。
  3. 改进的 SQL 和数据管理
    • 引入了标准 SQL 分页语法 (LIMIT... OFFSET..., OFFSET... FETCH...)。
    • 新的 LOAD SQL 命令,可以简化 DDL 语句的批量导入。
    • 增强的 ALTER TABLE 命令,可以在行布局和列布局之间无缝转换。
  4. 优化的数据库操作
    • 日志记录大小更小,效率更高。
    • 数据库压缩速度更快,尤其是对于具有大量大字符串内容的数据库。
    • 将新数据库添加到镜像时的自动化程度更高。
    • 用于 ECP 管理任务的新命令行实用工具。
  5. 更高的安全合规性
    • 支持符合 FIPS 140-3 标准的加密库。
  6. 现代化的互操作性用户界面
    • 选择参与经过改进的生产配置和 DTL 编辑器体验,其中包含源代码控制集成、VS Code 兼容性、增强的筛选功能、分屏视图等。请参阅此开发者社区文章,详细了解如何选择参与并提供反馈。
  7. 更多的医疗保健功能
    • 高效的批量 FHIR 引入和调度,包括完整性检查和资源管理。
    • 增强的 FHIR 批量访问和经过改进的 FHIR 搜索操作。
  8. 新的开发者体验功能
  9. 通过 OpenTelemetry 提高可观测性
    • 在 IRIS 中引入了跟踪功能,有助于详细观测 Web 请求和应用程序的性能。

请通过开发者社区分享您的反馈,以便我们可以共同打造更出色的产品。

文档

访问以下链接,可以详细了解所有着重介绍的功能:

此外,请查看升级影响核对清单,轻松了解升级到此版本时需要注意的所有变更。

尤其是,请注意 InterSystems IRIS 2025.1 引入了新的日志文件格式版本,该格式与早期版本不兼容,因而给混合版本的镜像设置带来了一定的限制。 请参阅相应的文档了解更多详细信息。

抢先体验计划 (EAP)

目前提供多个 EAP。 请查看此页面并注册您感兴趣的 EAP。

下载软件

一如既往,扩展维护 (EM) 版本提供了适用于所有受支持平台的经典安装包,以及 Docker 容器格式的容器镜像。

经典安装包

安装包可以从 WRC 的 InterSystems IRIS 页面(对于 InterSystems IRIS 和 InterSystems IRIS for Health)和 WRC 的 HealthShare 页面(对于 Health Connect)获取。 您也可以在评估服务网站中找到工具包。

可用性和软件包信息

此版本提供了适用于所有受支持平台的经典安装包,以及 Docker 容器格式的容器镜像。有关完整列表,请参阅“支持的平台”文档

此扩展维护版本的内部版本号为 2025.1.0.223.0

容器镜像可以从 InterSystems 容器注册表中获取。 容器被标记为 2025.1latest-em

0
0 76
InterSystems 官方 Claire Zheng · 六月 19, 2025 4m read

互操作性用户界面现在包括可以在所有互操作性产品中使用的 DTL 编辑器生产配置应用程序的现代化用户体验。您可以在现代化视图与标准视图之间切换。所有其他互操作性屏幕仍采用标准用户界面。请注意,仅对这两个应用程序进行了更改,我们在下面确定了当前可用的功能。

要在升级前试用新屏幕,您可以点击这里,从我们的社区工具包网页中下载 2025.1 版:https://evaluation.intersystems.com/Eval/。请观看“学习服务”中的简短教程构建集成:一种新的用户体验,了解对这些屏幕进行的用户增强!

生产配置 - 配置任务简介
  • 生产配置:在以下版本的生产配置中受支持:
    • 创建/编辑/复制/删除主机
    • 停止/启动主机
    • 编辑生产设置
    • 停止/启动生产
  • 源代码控制集成:支持上述配置功能的源代码控制集成。
  • 分屏 视图:用户可以直接从“生产配置”屏幕打开“规则编辑器”和“DTL 编辑器”,在分屏视图中查看和编辑产品中包含的规则和转换。
  • 增强的筛选功能:使用顶部的搜索框,您可以搜索和筛选各种业务组件,包括多种类别、DTL 和子转换。 使用左侧边栏可以独立于主面板进行搜索,查看各种主机和类别中的搜索结果。
  • 批量编辑主机类别:通过从生产配置中添加主机,您可以为生产添加新类别或编辑现有类别。
  • 可展开路由器:可以展开路由器,内联查看所有规则、转换和连接。
  • 重新设计的主机连接:现在,在选择业务主机时,将呈现直接连接和间接连接,您可以查看消息能够采用的完整路径。 将鼠标悬停在任何出站或入站主机上可以进一步区分连接。如果开启仅显示连接的主机开关,将仅筛选所选主机及其连接。
DTL 编辑器 - DTL 工具简介
  • 源代码控制集成:支持源代码控制集成。
  • VS Code 集成:用户可以在其 VS Code IDE 中查看此版本的 DTL 编辑器。
  • 嵌入式 Python 支持:此版本的 DTL 编辑器现在支持嵌入式 Python。
  • DTL 测试:可以在此版本的 DTL 编辑器中使用 DTL 测试实用工具。
  • 切换面板布局:DTL 编辑器支持侧面到侧面和顶部到底部布局。 点击顶部功能区的布局按钮可以体验此功能。
  • 撤消/重做:用户可以使用撤消/重做按钮撤消和重做所有尚未保存为代码的操作。
  • “生成空段”参数:GENERATEEMPTYSEGMENTS 参数可用于为缺失的字段生成空段。
  • 子转换查看:用户可以点击眼睛图标,在新选项卡中打开子转换 DTL,查看子转换。
  • 滚动
    • 单独滚动:将光标放置在 DTL 的左右两部分(源和目标)其中之一的上方,并用滚轮或触控板垂直移动各段,可以单独滚动各个部分。
    • 联合滚动:将光标放置在图的中间,可以联合滚动源部分和目标部分。
  • 字段自动补全:自动补全适用于:“源”、“目标”和“条件”字段以及源类、源文档类型、目标类、目标文档类型。
  • 顺序编号:使用可视化编辑器,您可以打开和关闭查看每个段的序数和完整路径表达式的功能。
  • 轻松引用:当操作编辑器中的某个字段获得焦点时,在图形化编辑器中双击某个段会在操作编辑器中的当前光标位置插入相应的段引用。
  • 同步:点击可视化编辑器中的一个元素,可以在操作编辑器中高亮显示相应的行。
📣号召性用语📣

如果您有任何反馈,请通过以下途径提供给我们:

  • 跨所有互操作性的新功能:在 Ideas 门户中输入想法,或在 InterSystems Ideas 门户中参与其他想法。 对于新想法,请在您的帖子上添加“互操作性”标签或对列表中已提出的功能进行投票!
  • 💻跨所有互操作性的一般用户体验反馈:请在下面输入您的反馈或参与其他评论。
  • 🗒对现代化应用程序的建议/反馈(如上所述):请在下面输入您的反馈或参与其他评论。

请考虑利用 Global Masters 的机会,与团队进行互动,参与不公开的指导反馈会议,并获得积分! 点击此处,通过 Global Masters 报名参加这些会议。

如果您希望以私人形式提供任何其他反馈,请通过电子邮件将您的想法或问题发送至:ux@intersystems.com  
 

0
0 47
文章 Michael Lei · 五月 12, 2021 11m read

InterSystems 数据平台和性能 - 第 5 部分 使用 SNMP 进行监控

在之前的帖子中,我展示了如何使用 pButtons 收集历史性能指标。 我首选 pButtons 是因为我知道它随每个数据平台实例(Ensemble、Caché、...)一起安装。 不过,还有其他方法可以实时收集、处理和显示 Caché 性能指标,以进行简单的监视,或进行更重要的并且复杂得多的运营分析和容量计划。 最常见的数据收集方法之一是使用 SNMP(简单网络管理协议)。

SNMP 是 Caché 向各种管理工具提供管理和监控信息的标准方式。 Caché 在线文档包含了 Caché 和 SNMP 之间接口的详细信息。 虽然 SNMP 应该可以直接与 Caché 配合工作,但仍有一些配置技巧和陷阱。 我经历了很多次错误的开始,并且在 InterSystems 其他同事的帮助下,才让 Caché 与操作系统 SNMP 主代理建立对话,所以我写了这篇帖子,希望您可以避免同样的痛苦。

在本帖中,我将介绍如何为 Red Hat Linux 上的 Caché 设置和配置 SNMP,您应该能够对其他 *nix 版本使用相同步骤。 我使用 Red Hat 写这篇文章是因为在 Linux 上进行设置更棘手一些;在 Windows 上,Caché 会自动安装一个 DLL 来与标准 Windows SNMP 服务连接,所以应该更容易配置。

3
2 456
文章 Lilian Huang · 六月 3, 2025 2m read

IRIS 支持开箱即用的 CCDA 和 FHIR 转换,但访问和查看这些功能需要大量的时间设置和产品知识。IRIS Interop DevTools 应用程序旨在弥补这一差距,让实施人员能够立即进入并查看产品的内置转换功能。

除了 IRIS XML、XPath 和 CCDA 转换环境,Interop DevTools 软件包现在还提供:

  • FHIR-SDA 转换设置
  • SDA-FHIR 转换设置
  • 构建 FHIR 错误验证
  • 加载 FHIR 转换所需的内容

已经更新仪表板的外观和感触,看起来更加直观和用户友好。在 IRIS 中执行,以便充分利用环境,同时用户界面允许可见性、可重复性以及隔离修改和模块进行测试的能力。

以下是5个功能支持:

1. XPath 评估器: 根据输入 CCD 评估 XPath 并返回结果

2. CCDA 到 SDA 转换: 通过选定的基本 XSL 转换运行输入的 CCD,并显示 SDA 结果。

3. XSL 模板测试器: 针对输入 CCD 应用单个 XSL 模板,并显示生成的 CCD。

4. FHIR 到 SDA 转换: 在输入的 FHIR 资源或捆绑包上运行标准的 FHIR 到 SDA 转换,并显示 SDA 结果或 FHIR 验证错误响应。

5. 5. SDA 到 FHIR 转换: 在输入的 SDA 消息上运行标准的 SDA 到 FHIR 转换,并显示 FHIR 束结果。

0
0 79
文章 Jeff Liu · 五月 15, 2025 24m read

在本文中,我们将使用基于分布式存储的 Kubernetes 部署来构建一个 IRIS 的高可用配置,而不使用“传统的”IRIS Mirror。 这种部署将能够容忍与基础架构相关的故障,如节点、存储和可用区故障。 所描述的方法可以大大降低部署的复杂性,代价是 RTO的略微延长。

0
0 96