搜索​​​​

清除过滤器
公告
jieliang liu · 二月 8, 2022

InterSystems IRIS 和 IRIS for Health 2021.2 正式发布!

InterSystems 数据平台团队非常高兴地宣布,InterSystems IRIS数据平台、InterSystems IRIS for Health和HealthShare Health Connect的2021.2版本现已向我们的客户和合作伙伴全面开放(GA)。 发布重点: InterSystems IRIS数据平台2021.2使开发、部署和管理连接数据和应用孤岛的增强型应用和业务流程更加容易。它有许多新的功能和改进! 为应用程序和界面开发人员提供的增强功能,包括: 嵌入式Python 使用Python进行互操作性开发 对Visual Studio Code ObjectScript扩展包的更新 增加了新的业务服务和操作,允许用户以最少的自定义编码来设置和运行SQL查询 对分析和人工智能的增强,包括: 新的SQL LOAD命令有效地将CSV和JDBC源数据加载到表中 增强适应性分析的功能 对云计算和运营任务的加强,包括: 新的云连接器使得在InterSystems IRIS应用程序中访问和使用云服务变得简单。 IKO的改进提高了Kubernetes资源的可管理性 对数据库和系统管理员的增强,包括: 在线分片再平衡可以在不中断操作的情况下自动在各节点间分配数据 自适应SQL引擎使用快速块采样和自动化来收集高级表的统计数据,并利用运行时信息来改进查询规划 通过新的流和日志文件压缩设置,InterSystems IRIS的存储需求得以降低 支持TLS 1.3和OpenSSL 1.1.1,使用系统提供的库 新的^TRACE工具报告详细的进程统计数据,如缓存点击率和读取率 关于所有这些功能的更多细节可以在产品文档中找到: InterSystems IRIS 2021.2 documentation and release notes InterSystems IRIS for Health 2021.2 documentation and release notes HealthShare Health Connect 2021.2 documentation and release notes 如何获得软件 InterSystems IRIS 2021.2是一个持续交付(CD)版本,现在带有所有支持平台的经典安装包,以及OCI(Open Container Initiative)(又称Docker容器格式)的容器镜像。 容器镜像可用于Linux x86-64和Linux ARM64的OCI兼容运行时引擎。 详见 支持平台文档. 每个持续交付产品的完整安装包都可以从WRC 支持中心的网站 获得 . 使用 "自定义 "安装选项使用户能够挑选他们需要的选项,如InterSystems Studio和IntegratedML,以正确地缩小他们的安装范围。 容器镜像 企业版本,和社区版本 和所有的相关组件都可以从 InterSystems Container Registry 使用以下命令获得: docker pull containers.intersystems.com/intersystems/iris:2021.2.0.649.0 docker pull containers.intersystems.com/intersystems/iris-ml:2021.2.0.649.0 docker pull containers.intersystems.com/intersystems/irishealth:2021.2.0.649.0 docker pull containers.intersystems.com/intersystems/irishealth-ml:2021.2.0.649.0 有关可用镜像的完整列表,请参考 ICR 文档. 另外,所有容器镜像的tarball版本可以通过WRC的 CD容器产品下载网站获得。. 我们在主要云市场上的相应列表将在未来几天内更新。 分享你的经验 我们很高兴看到这个版本现在达到了GA的里程碑,并渴望听到你对新软件的体验。请不要犹豫,通过InterSystmes的销售团队或 开发者社区 与我们联系。 对于选定的新功能和产品,我们已经建立了早期试用计划,允许我们的用户在软件发布之前进行评估。通过这些有针对性的举措,我们可以向目标受众学习,确保新产品在发布时能满足他们的需求。如果你有兴趣参与其中的任何一项,请通过InterSystems销售团队或 开发者社区 与我们联系。
文章
Jingwei Wang · 二月 14, 2022

使用嵌入式Python实现InterSystems IRIS 互操作性

# 1. 互操作性-嵌入式Python(interoperability-embedded-python) 这个概念旨在展示**iris互操作性框架**如何与嵌入的python一起使用。 ## 1.2. 示例代码 ``` import grongier.pex import iris import MyResponse class MyBusinessOperation(grongier.pex.BusinessOperation): def OnInit(self): print("[Python] ...MyBusinessOperation:OnInit() is called") self.LOGINFO("Operation OnInit") return def OnTeardown(self): print("[Python] ...MyBusinessOperation:OnTeardown() is called") return def OnMessage(self, messageInput): if hasattr(messageInput,"_IsA"): if messageInput._IsA("Ens.StringRequest"): self.LOGINFO(f"[Python] ...This iris class is a Ens.StringRequest with this message {messageInput.StringValue}") self.LOGINFO("Operation OnMessage") response = MyResponse.MyResponse("...MyBusinessOperation:OnMessage() echos") return response ``` ## 1.3. 注册一个组件 **不需要 ObjectScript 代码**. 多亏Grongier.PEX.Utils.RegisterComponent()方法。 启动一个嵌入式的Python shell: ``` /usr/irissys/bin/irispython ``` 然后使用这个类方法将一个新的py文件添加到组件列表中,以实现互操作性。 ``` iris.cls("Grongier.PEX.Utils").RegisterComponent(,,,,) ``` 例如 : ``` iris.cls("Grongier.PEX.Utils").RegisterComponent("MyCombinedBusinessOperation","MyCombinedBusinessOperation","/irisdev/app/src/python/demo/",1,"PEX.MyCombinedBusinessOperation") ``` # 2. 演示 Production有四个Python组件: - 两个业务服务组件 : - 用Grongier.PEX.MyCombinedBusinessService持续的给业务操作组件发送同步消息 - 这些消息是JSON格式的Python对象,存储于Grongier.PEX.Message类 - Thoses messages are python objects casted in JSON and stored in Grongier.PEX.Message. - Python代码 : src/python/demo/MyCombinedBusinessService.py - Grongier.PEX.MyBusinessService是一个用于写消息日志的原始业务服务组件,无其他作用。 - Python 代码 : src/python/demo/MyBusinessService.py - 两个业务操作组件: - Grongier.PEX.BusinessOperation是用于接收业务服务组件Grongier.PEX.MyCombinedBusinessService的消息 - Python 代码 : src/python/demo/MyBusinessOperation.py - Grongier.PEX.CombinedBusinessOperation可以接收Ens.StringRequest消息,并返回Ens.StringResponse消息 - Python 代码 : src/python/demo/MyCombinedBusinessOperation.py 为Python本地消息新增json跟踪: # 3. 前置需求 Git和Docker必须已安装 # 4. 使用Docker安装 从git拉取repo到本地 ``` git clone https://github.com/grongierisc/interpeorability-embedded-python ``` 在安装路径打开terminal,并运行: ``` docker-compose build ``` 使用IRIS容器运行你的项目: ``` docker-compose up -d ``` # 5. 无Docker安装 在iris 实例上安装 grongier_pex-1.0.0-py3-none-any.whl : ``` /usr/irissys/bin/irispython -m pip install grongier_pex-1.0.0-py3-none-any.whl ``` 然后,加载ObjectScript类: ``` do $System.OBJ.LoadDir("/opt/irisapp/src","cubk","*.cls",1) ``` # 6. 运行How to Run the Sample 打开production,并运行。 示例代码会开始运行。 # 7. repo中包含什么内容What's inside the repository ## 7.1. Dockerfile Dockerfile包含在容器中安装一些python的依赖项,例如pip, venv和sudo 然后创建dev目录将git仓库复制进入目录 Dockerfile启动IRIS并导入Titanics csv文件,然后为Python Shell激活**%Service_CallIn**。 可以使用使用相关的docker-compose.yml来轻松地设置额外的参数,如端口号和映射键和主机文件夹的位置。 这个dockerfile以安装python模块的需求结束。 最后一部分是关于安装jupyter notebook和它的内核。 使用.env/文件来调整在docker-compose中使用的dockerfile。 ## 7.2. .vscode/settings.json VSCode配置文件 [VSCode ObjectScript plugin](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript) ## 7.3. .vscode/launch.json VSCode ObjectScript 调试配置文件 [获取更多相关信息](https://community.intersystems.com/post/dockerfile-and-friends-or-how-run-and-collaborate-objectscript-projects-intersystems-iris) ## 7.4. .vscode/extensions.json 如果你想在容器中用VSCode运行,可以添加扩展。 [获取更多相关信息](https://code.visualstudio.com/docs/remote/containers) 对于使用嵌入式python非常有用。 ## 7.5. src 文件夹 ``` src ├── Grongier │ └── PEX // ObjectScript classes that wrap python code │ ├── BusinessOperation.cls │ ├── BusinessProcess.cls │ ├── BusinessService.cls │ ├── Common.cls │ ├── Director.cls │ ├── InboundAdapter.cls │ ├── Message.cls │ ├── OutboundAdapter.cls │ ├── Python.cls │ ├── Test.cls │ └── Utils.cls ├── PEX // Some example of wrapped classes │ ├── MyBusinessOperationWithAdapter.cls │ ├── MyBusinessOperationWithIrisAdapter.cls │ ├── MyBusinessOperationWithPythonAdapter.cls │ ├── MyBusinessService.cls │ ├── MyOutboundAdapter.cls │ └── Production.cls └── python ├── demo // Actual python code to run this demo │ ├── MyBusinessOperation.py │ ├── MyBusinessOperationWithAdapter.py │ ├── MyBusinessOperationWithIrisAdapter.py │ ├── MyBusinessProcess.py │ ├── MyBusinessService.py │ ├── MyCombinedBusinessOperation.py │ ├── MyCombinedBusinessProcess.py │ ├── MyCombinedBusinessService.py │ ├── MyInboundAdapter.py │ ├── MyLoggingOperation.py │ ├── MyNonPollingStarter.py │ ├── MyOutboundAdapter.py │ ├── MyRequest.py │ ├── MyResponse.py │ ├── MySyncBusinessProcess.py │ └── SimpleObject.py ├── dist // Wheel used to implement python interoperability components │ └── grongier_pex-1.0.0-py3-none-any.whl ├── grongier │ └── pex // Helper classes to implement interoperability components │ ├── _BusinessHost.py │ ├── _BusinessOperation.py │ ├── _BusinessProcess.py │ ├── _BusinessService.py │ ├── _Common.py │ ├── _Director.py │ ├── _InboundAdapter.py │ ├── _Message.py │ ├── _OutboundAdapter.py │ └── __init__.py └── setup.py // setup to build the wheel ``` # 8. 如何增加一个新组件 ## 8.1. 入站适配器InboundAdapter 使用python执行入站适配器,使用grongier.pex.InboundAdapter子类,覆盖OnTask()方法。 ## 8.2. 出站适配器OutboundAdapter 使用python执行出站适配器,使用grongier.pex.OutboundAdapter子类,实现所需action方法。 ## 8.3. 业务服务组件BusinessService 使用python执行业务服务组件,使用grongier.pex.BusinessService子类,覆盖OnProcessInput()方法。 ## 8.4. 业务流程组件BusinessProcess 使用python执行业务流程组件,使用grongier.pex.BusinessProcess子类,覆盖 OnRequest(), OnResponse() and OnComplete()方法。 ## 8.5. 业务操作BusinessOperation 使用python执行业务流程组件,使用grongier.pex.BusinessOperation子类,覆盖 OnMessage()方法。 ## 8.6. 注册一个组件 启动一个嵌入式python shell: ``` /usr/irissys/bin/irispython ``` 然后使用这个类方法将一个新的py文件添加到组件列表中,以实现互操作性。 ``` iris.cls("Grongier.PEX.Utils").RegisterComponent(,,,,) ``` 例如 : ``` iris.cls("Grongier.PEX.Utils").RegisterComponent("MyCombinedBusinessOperation","MyCombinedBusinessOperation","/irisdev/app/src/python/demo/",1,"PEX.MyCombinedBusinessOperation") ``` ## 8.7. 直接使用Grongier.PEX 如果你不想使用RegisterComponent,你可以添加一个Grongier.PEX.Business*组件并配置其属性 - %module : - 你的python代码的模块名称 - %classname : - 你的组件的类名 - %classpaths - 你的组件所在的路径。 - 除了PYTHON_PATH之外,可以有一个或多个Classpaths(用'|'字符分隔) 例如 : # 9. 其他工作 - 仅业务服务组件和业务操作组件可以被测试 - 在适配器上工作 # 10. 认证 大部分代码来自Mo Cheng和Summer Gerry的PEX for Python。 注册部分来自于尚未发布的IRIS 2021.3的功能。
文章
Jingwei Wang · 二月 15, 2022

如何用Python访问InterSystems IRIS数据库

1. 使用PyODBC访问InterSystems IRIS数据库 pyodbc是一个开源的Python模块,可以利用ODBC来访问底层数据库。InterSystems支持使用pyodbc作为使用关系模式从Python访问数据库的一种方式。这个模块也可以用于InterSystems IRIS的早期版本。 代码示例 import pyodbc def run(): # connection information ip = localhost port = 51773 # IRIS超级服务端口号 namespace = USER username = <userName> password = <password> driver = "{InterSystems IRIS ODBC35}" # ODBC data source名称, IRIS 安装时一般自带ODBC驱动,所以不需要独立安装 ​ # Create connection to InterSystems IRIS connection_string = 'DRIVER={};SERVER={};PORT={};DATABASE={};UID={};PWD={}' \ .format(driver, ip, port, namespace, username, password) print(connection_string) connection = pyodbc.connect(connection_string) connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') connection.setencoding(encoding='utf-8') print("Connected to InterSystems IRIS") ​ ​ if __name__ == '__main__': run() 在windows终端执行上面的python文件,可以运行成功,代表您已经可以从通过pyodbc访问InterSystems IRIS 2. 使用 InterSystems IRIS Native API 访问InterSystems IRIS 数据库 2.1 安装 .whl 文件 2.2 代码示例 """ PURPOSE: Makes a connection to an instance of InterSystems IRIS Data Platform using the native API """ ​ import irisnative def run(): # connection information ip = localhost port = 51773 # IRIS超级服务端口号 namespace = USER username = <userName> password = <password> ​ # Create connection to InterSystems IRIS connection = irisnative.createConnection(ip, port, namespace, username, password) ​ print("Connected to InterSystems IRIS") ​ # Create an iris object iris_native = irisnative.createIris(connection) ​ ​ if __name__ == '__main__': run() 可以在windows终端执行上面的python文件,可以运行成功,代表您已经可以从通过Native API访问InterSystems IRIS 3. Pyodbc 与 Native API的区别 PyODBC可以让你的应用程序快速检索、更新和删除数据。 Native API可以让你的应用程序直接访问InterSystems IRIS中的底层数据结构(globals),以及调用ObjectScript方法和例程。
问题
泽 吴 · 三月 16, 2022

我就一个问题,InterSystems IRIS 怎么用

我就一个问题,InterSystems IRIS 怎么用,我就想创建一个数据库(也不知道是不是cache),然后通过jdbc url 连接,找了一个星期的文档,不知道jdbc url 是什么,完全靠猜,别跟我说文档,没有一个靠谱的 不知道你在哪里找文档找了一个星期,可以直接去docs.intersytems.com,选择你要对应的版本,然后再查找框里输入jdbc url, 比如我在最新的InterSystems IRIS for health 2021.2的文档中查到: jdbc:IRIS://<host>:<port>/<namespace>/<logfile>:<eventclass>:<nodelay>:<ssl> 比如: jdbc:IRIS://127.0.0.1:1972/User 原文在这里:https://docs.intersystems.com/irisforhealth20212/csp/docbook/DocBook.UI.Page.cls?KEY=BJAVA_connecting#BJAVA_connecting_url 从文档库搜索关键词“JDBC“ 进入第一篇或第二篇文档,其中明确指出了IRIS使用的JDBC参数 耗时大约15秒 请务必使用官方文档以达到事半功倍的效果哦
文章
Claire Zheng · 三月 29, 2022

什么是卓越?——InterSystems全球副总裁John Paladino

卓越是什么?是思维方式,理念,还是结果? 在InterSystems,我们用行动来定义卓越。卓越意味着设立非常高的标准并超越它;卓越意味着不管是最小的姿态,还是最大的努力都同等重要;卓越意味着积极主动,即使是在客户还不清楚的情况下也努力去了解客户真正需要的东西,在客户提问之前就准备好相应的解决方案;卓越意味着着眼未来,分析潜在趋势,发现机会并有效协同,将一个个创意转化成为可行动的计划。 卓越是驱动我们与像您一样珍贵的合作伙伴一起支持起全世界最核心的关键应用。卓越是我们为何和如何能持续解决问题,成为客户可信赖的合作伙伴,以及成为支撑最重要的关键系统背后的力量。我们全力追求卓越,为客户更好地解决问题。但是不要仅仅向我们提出问题,我们也非常欢迎您的创意和目标,让我们一起来实现它们!
文章
jieliang liu · 四月 8, 2022

Kettle 中使用JDBC链接 InterSystems IRIS

使用 JDBC 链接 InterSystems : ​将IRIS jdbc 驱动拷贝到 安装文件夹/lib 下 ​自定义链接URL: jdbc:IRIS://ipAddress:superserverPort/namespace ​​自定义驱动器类名称: com.intersystems.jdbc.IRISDriver 然后就可以像其他关系型数据库使用的方式来使用Kettle。
公告
Tingting Jiang · 六月 21, 2022

InterSystems热招职位(2):Technical Specialist(Implementation)

InterSystems正在招聘Technical Specialist(Implementation),欢迎您的自荐、推荐。请将简历投递至Belinda.Glasson@intersystems.com,愿您的加入给我们带来新的活力,我们也将为您提供广阔的发展空间! (由于岗位职能要求,职位说明以英文形式发布。) Location:Beijing Job Title:Technical Specialist Department:Implementation Reporting to:Program Director What We Do Matters Why are we here? To ensure that our customers have reliable access to the right information at the right time—information they can share and use to draw insights, leading to better decisions. Job Summary The Technical Specialist will be required to perform custom development tasks and provide support for InterSystems TrakCare and related products. The Technical Specialist will be responsible for site specific software support and development activities and to ensure that the software satisfies project specifications and is delivered and deployed in line with project requirements. The Technical Specialist must be available to visit client sites (e.g. hospitals/laboratories) and implementation partners for technical support and/or to provide technical training. International travel may be required. Key Responsibilities of the Role Liaise with client or business analyst in regard to ongoing support or enhancement requests. Liaise with other InterSystems support and implementation team members to analyze problems and specify, document, test, and manage deployment of fixes for product functions or custom enhancements. Liaise with client or business analyst on any requests for new or modified reports. Advise and assist TrakCare Project Managers during implementation. Manage the resolution of any outstanding acceptance issues before and after project go-live. Develop custom/site specific software such as JavaScript, user defined functions, interfaces, reports, extracts, data migration scripts and conversions. Provide technical support for custom development i.e. JavaScript, user defined functions, interfaces, reports, extracts, data migration scripts and conversions. Provide support on the data dictionary. Provide advice and best practices to Clients for technical areas such as networks, configurations, architectures, custom development, etc. Provide technical support for troubleshooting and performance analysis for reports, stored procedures, interfaces, conversions, data migration scripts and user defined functions. Monitoring and responding to Technical Team calls on the TRC problem management system. Support and testing of all TrakCare related utilities, e.g. patching tool, print service etc. Production of training materials for technical courses such as system custom development or reporting. Production of technical documentation such as reference materials, installation instructions, user guides, knowledge-base articles and how-tos. Responsible for participating in on-site technical training if required. Responsible for participating in on-site technical implementations if required. Responsible for participating in the on call 24 hour roster service. Assistance in researching new development or report writing using InterSystems technologies and 3rd party products. Other duties may be directed by the Company from time to time. Experience and Qualifications Graduate IT qualifications highly desirable. Experience in an application development/programming position or a position providing technical support including analysis of program code. Knowledge of web orientated languages, including SQL, HTML, JavaScript. Proficient and knowledgeable in one or more of the following programming languages or equivalent: Java, C#, C, C++, Pascal, Perl, Python, Ruby, JavaScript, VisualBasic, Cache' Object Script, M (MUMPS). Experience with data analysis and database methodologies. Experience with Microsoft Office. Be able to design and write technical documents. Well versed in Internet / Intranet concepts including web development and web servers. Experienced in customer focused support or implementation. Proven ability to lead and deliver results as required within specific time frames. Good presentation and communication skills. Ability to conduct training and develop training materials. Ability to work within a team in a cross cultural environment. Available for out of office hours work and willing to travel. Keen to learn new technologies and new applications. Education and Training Degree in Computer Science or Information Technology
文章
Lilian Huang · 六月 23, 2022

InterSystems 许可证信息和查询支持Tips

InterSystems许可证是指InterSystems发放的电子或纸质版的产品许可证,内容包括许可证订购日期、产品描述等。 激活码/License Key是InterSystems随许可证发放的许可软件激活码。通常情况下,客户收到的是电子许可证。 以下是一些许可证,激活码/License key常见咨询问题参考: 收到电子许可证后,如何获取纸质版许可证? 纸质版许可证或是安装介质盘,可通过合作伙伴或是致电原厂核验许可证信息后获取。 如需申请WRC支持,需要 申请准备: WRC账号,如无请通过WRC联络信息申请WRC账号 故障问题描述 许可证或激活码/License key 最终客户名称 WRC全球响应中心联络信息: 电话: +86 400-601-9890 邮件: support@intersystems.com 网站1(国内用户): https://wrc.intersystems.cn/ 网站2:https://wrc.intersystems.com 如何查询您的授权文件客户名和授权密钥? 方法1: 使用管理门户 以管理员身份登录到系统管理门户,进入菜单:系统管理>软件许可颁发>软件许授权码 (或英文菜单:System Administartion>Licensing>License Key) 记录客户名和授权密钥: 方法2 :使用命令行 执行命令: w $System.License.CKEY(),并拷贝输出内容 USER>w $System.License.CKEY() Cache Key display: Based on the active key file 'c:\intersystems\cache\mgr\cache.key' LicenseCapacity = Cache 2017.1, Enterprise:100, Concurrent User CustomerName = *** OrderNumber = 54321 ExpirationDate = 11/30/2022 AuthorizationKey = ******************************************************** MachineID = 方法3 :查看授权文件 使用文本编辑器查看您收到的授权文件。如果您不知道授权文件保存在哪里,可以到服务器的<InterSystems产品安装目录>/mgr/ 下找到cache.key (Cache’/Ensemble/旧版HealthConnect) 或iris.key (IRIS/新版HealthConnect)。 如何查询您的许可证产品类型和版本 方法1 :使用管理门户 任意身份登录到管理门户,点击菜单“关于”,记录版本信息。 方法2 :使用命令行 执行命令: w $ZV,并拷贝输出内容 USER>w $ZV Cache for Windows (x86-64) 2017.1.1 (Build 111U) Wed May 17 2017 15:34:56 EDT 备注:其他许可证任何问题,欢迎咨询:GCDPSales@intersystems.com。
文章
Lilian Huang · 六月 14, 2022

[首次使用InterSystems IRIS] 互操作性: Message消息

这篇文章是上一篇文章的延续https://cn.community.intersystems.com/post/首次使用intersystems-iris-互操作性-一个production是什么? 在上一篇文章:https://cn.community.intersystems.com/post/首次使用intersystems-iris-互操作性-一个production是什么? 我们查验了什么是Production. 我们运行了示例代码,并在Visual Trace 页面查验了如何将流动消息的内容引入进Production中。 本文将回顾消息messages的概念和定义,和消息如何在系统集成所需的开发内容中用于组件之间发送和接收数据。 Production生产http://[https://cn.community.intersystems.com/post/首次使用intersystems-iris-互操作性-一个production是什么? Message消息 Components组件 Business Services业务服务 Business Processes业务流程 Business Operations业务操作 在创建 一个Message消息之前,让我们回顾一个案例研究。 一家公司经营着一个购物网站,并且正在为了适应季节而改变显示的产品信息顺序。 然而,有些商品无论季节如何都卖得很好,而有些商品在想不到的时间卖的很好,这与当前要更改顺序的显示规则不符。<br />因此,我们研究了更改显示商品顺序规则的可能性是匹配当天的温度而不是季节。 这就使得在购买商品时测量当时的温度变的很有必要。 由于一个外部的Web API可以查看天气信息,我们计划在商品购买时收集当时的天气信息并在将其录入数据库。 从本案例中,您可以看到以下内容: 从外部收到的信息是“购买的产品名称和城市名称” 从IRIS发送到外部系统以请求处理的信息是“城市名称”。该过程的结果是输入进的城市 “天气信息” 通过本案例研究,我们将执行系统集成所需的组件,在此之前,要运行这些组件,需要发送和接收messages消息,这些消息是中继转发数据,要使用这些messages消息,需要定义消息类。 一个消息类的设计需要考虑应该发送和接收哪些信息(即,messages消息),以使组件运行。 在此过程中,我们需要以下两类信息: A) 要获取天气信息时发送给外部Web API 的城市名称。 B) 记录在数据库中的天气信息和购买的产品名称。 A)中的城市名称和B)中的购买产品名称可以被包含进输入给IRIS的信息中。 B) 中的天气信息可以从外部Web API的响应信息中检索。 下面的图表就是考虑了从可用数据中发送和接收每个组件所需的信息。 黄色方框的第一行描述消息类别名,第二行之后说明为属性设置。 在示例代码中,我们有以下三种类型的messages消息: Start.Request(请求消息) 它用于发送购买的产品名称和城市,以获取天气信息。 Start.Response(响应消息) 它们用于返回操作的结果(天气信息)。 Start.InsertRequest(请求信息) 用于发送天气信息和购买产品的名称,以便在数据库系统注册。 The messages are specified in a superclass, Request message, and Response message are derived from Ens.Request and Ens.Response, respectively. The following is an example of the definition of the Request message Start.Request. messages 消息在超类别中指定,请求消息和响应消息派生自Ens.Request and Ens.Response,分别作出回应。 以下是Start.Request的定义示例: 以下是响应消息的一个示例, 请求消息, 将请求输入和数据库注册的请求信息发送至如下: (我们计划将天气信息属性设置在Start.Response中,获取天气信息后再返回。) 如果要在Studio中创建,您也可以使用Wizard创建消息。 参考)在Studio中创建响应类的步骤。 总结关键的点在于消息设计的思路“应该发送和接收哪些信息(i.e., messages)”以使组建运行。 一旦消息类实现后(驱动每个组件的信息是什么),下一步即是为组件创建类别。 原文请参考:https://community.intersystems.com/post/intersystems-iris-first-time-interoperability-message written by Mihoko Iijima
公告
Claire Zheng · 七月 1, 2022

InterSystems 2022 Full Stack开发者大赛

大家好!欢迎参加InterSystems第21届开发者大赛! 🏆 InterSystems 2022 Full Stack开发者大赛 🏆 时间: 2022年6月27日-7月17日(美东时间) 奖金:$10,000 主题 💡 Full Stack 应用 💡 以InterSystems IRIS, InterSystems IRIS For Health(医疗版)或 IRIS Cloud Service为后端开发一个Full Stack解决方案。所谓的Full Stack,即通过REST API、Native API、ODBC/JDBC或嵌入式Python在InterSystems IRIS中插入、更新或删除数据的前端web或移动应用程序。 还有呢? 这次我们希望邀请开发者们以自己的专长来解决一个全球面临的挑战!我们鼓励你加入这次竞赛,提交聚焦于气候变化问题的解决方案:1) 如果您提交的应用能够解决一个与全球变暖或气候变化相关的问题,将收到一份特别奖励;2) 如果您准备并将在Open Exchange提交一个与全球变暖或气候变化相关的数据集,也会得到额外奖励。 那么,我们期待您的创新方案,共同建设一个可持续的发展的世界。用您的专长,为气候问题来制定解决方案吧! 基本要求: 有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 该应用可以在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition上运行。 该应用需开源并在GitHub上发布。 该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 奖品 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第1名 - $4,000 🥈 第2名 - $2,000 🥉 第3名 - $1,000 🌟 第4-15名- $100 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第1名 - $1,000 🥈 第2名 - $750 🥉 第3名 - $500 ✨ 所有获奖者都将获得Global Masters徽章! 注意:如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 关键参赛节点 🛠 应用开发、提交阶段 2022年6月27日 00:00 ( 美东时间): 竞赛启动. 2022年7月10日 23:59 ( 美东时间): 提交截止 ✅ 投票阶段 2022年7月11日 00:00 ( 美东时间): 投票开始 2022年7月17日 23:59 ( 美东时间): 投票截止 注意:在整个参赛期间(开发与投票期间),开发者可持续提升其应用 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile 资源助力: ✓ 适用于Full Stack应用的InterSystems IRIS Docker模板: IRIS Full Stack template Basic InterSystems IRIS Docker template IRIS REST API template Native API template IntegratedML template IRIS Analytics template isc-ipm-js isc-perf-ui isc-json isc-rest isc-codetidy ✓ 在线课程: Implementing RESTful Applications ✓ 视频: REST API design and Development REST API in 5 minutes Data-Driven Web Apps ✓ IRIS初学者: Build a Server-Side Application with InterSystems IRIS Learning Path for beginners ✓ ObjectScript Package Manager (ZPM) 初学者: How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS Package First Development Approach with InterSystems IRIS and ZPM ✓ 如何将您的APP提交给大赛: 如何在InterSystems Open Exchange上发布应用程序 如何把参赛APP提交给大赛 需要帮助? 加入InterSystems的 Discord server频道,或跟帖评论提出您的问题! 期待您的精彩提交!祝好运 👍 参与此次竞赛,您同意 遵守相关条款,请认真阅读。
文章
Jingwei Wang · 七月 14, 2022

InterSystems SQL 的使用 - 第二部分 - 基础介绍

本文概述了InterSystems SQL的特点,特别是那些没有被SQL标准所涵盖或与InterSystems IRIS 数据平台的统一数据架构有关的特点。假定你已有SQL的知识,本文不是SQL概念或语法的介绍。 表 在InterSystems SQL中,数据是在表内呈现的。每个表都被定义为包含若干列。一个表可以包含零个或多个数据值的行。以下术语大致上是等同的。 数据 关系型数据库术语 InterSystems SQL术语 InterSystems IRIS术语 database schema schema package database table table persistent class field column column property record row row schema SQL schema提供了一种将相关表、视图、存储过程和缓存查询分组的方法。模式的使用有助于防止在表一级的命名冲突,因为一个表、视图或存储过程的名称必须只在其schema内是唯一的。一个应用程序可以在多个schema中指定表。 SQL schema对应于IRIS中持久化的类包。通常情况下,一个模式的名称与它对应的包的名称相同,但是这些名称可能会因为不同的模式命名惯例而不同,或者因为不同的名称被故意指定。 命名:schema.name。如果没有指定schema:例如只有name。InterSystems IRIS会按以下方式提供模式。 对于DDL操作,InterSystems IRIS使用全系统默认的schema名称SQLUser。这个默认是可配置的。它适用于所有命名空间。 对于DML操作,InterSystems IRIS可以使用用户提供的schema搜索路径或全系统默认的schema名称。在动态SQL、嵌入式SQL和SQL Shell中,使用不同的技术来提供schema搜索路径。 在管理门户中查看一个命名空间内的所有现有schema: 从管理门户中选择系统资源管理器,然后选择SQL。用页面顶部的切换选项选择一个命名空间;这将显示可用的命名空间的列表。选择一个命名空间。选择屏幕左边的模式下拉列表。这将显示当前命名空间中的schema列表。从这个列表中选择一个schema; SQL 查询 查询有两种类型:检索数据的查询(SELECT语句)和修改数据的查询(INSERT、UPDATE和DELETE语句)。 你可以以多种方式使用SQL查询: 在ObjectScript中使用嵌入式SQL。 在ObjectScript中使用动态SQL。 调用使用CREATE PROCEDURE或CREATE QUERY创建的存储过程。 使用一个类查询。 使用来自其他环境的ODBC或JDBC接口。 SELECT查询在本指南的查询数据库一章中有描述。 查询是InterSystems IRIS对象或ObjectScript程序的一部分。 Privileges 特权 InterSystems SQL提供了一种方法,通过权限来限制对表、视图等的访问。你可以定义一组用户和角色,并授予他们各种权限(读、写等等)。 数据显示 SelectMode InterSystems SQL使用SelectMode选项来指定数据的显示或存储方式。可用的选项有逻辑模式、显示模式和ODBC模式。 数据在内部以逻辑模式存储,并可以以任何模式显示。每个数据类型类都可以通过使用LogicalToDisplay(), LogicalToODBC(), DisplayToLogical(), ODBCTtoLogical()方法来定义内部逻辑格式和显示格式或ODBC格式之间的转换。 当SQL SelectMode是显示模式时,LogicalToDisplay转换被应用,返回的值被格式化以用于显示。默认的SQL选择模式是逻辑模式;因此默认返回的值是以其存储格式显示的。 模式会影响查询结果集数据的显示格式,也会影响数据值的提供格式,如果提供的数据值与SelectMode不匹配,可能会导致错误或错误的结果。 例如,例如在WHERE子句中,如果DOB是一个以$HOROLOG逻辑格式存储的日期,而WHERE子句指定WHERE DOB > 2000-01-01(ODBC模式),SelectMode = ODBC返回预期的结果。但是,如果SelectMode = 显示模式,则生成SQLCODE -146 无法将日期输入转换为有效的逻辑日期值。如果SelectMode = 逻辑模式,则试图将2000-01-01解析为一个逻辑日期值,并返回0行。 对于大多数数据类型,三种SelectMode模式返回相同的结果。以下数据类型受到SelectMode选项的影响。 日期、时间和时间戳数据类型。 %List数据类型 - 在ODBC选择模式下,列表项之间用逗号分隔符显示。在显示选择模式下,列表项之间以空白分隔符显示。 指定VALUELIST和DISPLAYLIST的数据类型。对于必填字段,如果您在显示模式下,在字段有DISPLAYLIST的表中插入一个值,您输入的显示值必须与DISPLAYLIST中的一个项目完全匹配。对于非必填字段,不匹配的值被转换为NULL值。 空字符串,和空BLOB(流字段)。在逻辑模式下,空字符串和BLOBs由非显示字符$CHAR(0)表示。在显示模式下,它们由一个空字符串("")表示。 SQL的SelectMode可以按以下方式指定。 对于当前进程,使用SetOption("SelectMode")方法。 对于InterSystems SQL Shell会话,使用SET SELECTMODE命令。 对于来自管理门户 "执行查询 "用户界面(系统浏览器,SQL)的查询结果集,使用 "显示模式 "下拉列表。 对于一个动态SQL %SQL.Statement实例,使用%SelectMode属性。 对于嵌入式SQL,使用ObjectScript的 #SQLCompile Select 预处理器指令设置。这个指令允许第四个值,Runtime,它将选择模式设置为RuntimeMode属性的任何设置。RuntimeMode默认为逻辑模式。 #SQLCOMPILE SELECT=Logical #SQLCOMPILE SELECT=Display #SQLCOMPILE SELECT=ODBC 对于的SQL命令CREATE QUERY、CREATE METHOD、CREATE PROCEDURE和CREATE FUNCTION, 使用SELECTMODE关键字。 对于SQL查询中的单个列,使用%EXTERNAL、%INTERNAL和%ODBCOUT函数。 SELECT TOP 5 DOB,%EXTERNAL(DOB) AS ExtDOB Data Collation data collation规定了数值的排序和比较方式,它是InterSystems SQL和InterSystems IRIS对象的一部分。 你可以指定collation类型作为字段/属性定义的一部分。除非另有规定,否则字符串字段/属性默认为命名空间的默认排序。默认情况下,字符串的命名空间默认排序是SQLUPPER。SQLUPPER排序法将字符串转换为大写字母,以便进行排序和比较。因此,除非另有规定,否则字符串的排序和比较是不分大小写的。 你可以指定一个collation类型作为索引定义的一部分,或者使用被索引字段的collation类型。 一个SQL查询可以通过对字段名应用一个collation函数来覆盖已定义的collation类型的字段/属性。ORDER BY子句指定了一个查询的结果集顺序;如果一个指定的字符串字段被定义为SQLUPPER,查询结果顺序是不区分大小写的。 SQL 执行 编写和执行SQL代码的方法包括: 嵌入式SQL:在ObjectScript代码中嵌入SQL代码。 动态SQL:从ObjectScript中执行SQL代码,使用%SQL.Statement类。 Execute()方法:使用%SYSTEM.SQL类的Execute()方法执行SQL代码。 包含SQL代码的存储过程:使用CREATE PROCEDURE或CREATE QUERY创建。 SQL Shell:从终端界面执行的SQL语句。 从管理门户执行的SQL语句:系统资源管理器 -> SQL。 使用InterSystems IRIS对象(类和方法): 定义一个持久的类(一个SQL表)。 定义一个索引。 定义和使用一个类查询。
公告
Jingwei Wang · 五月 11, 2022

认识InterSystems全球峰会的主要发言人

各位开发者们好,: 很高兴跟大家宣布,畅销书作家和技术专家杰弗里·摩尔将在6月22日InterSystems的全球峰会上做专题演讲。以下是他的简历: 杰弗里·摩尔是一名咨询专家,他最近的咨询业务包括Salesforce、微软、Autodesk、F5Networks、Gainsight、谷歌和Splunk。 他一生的工作都集中在颠覆性创新的市场动态上。他的第一本书《跨越鸿沟》是关于创业公司在从早期采用者过渡到主流客户时所面临的挑战,该书已售出超过一百万册。摩尔最近的作品《Zone to Win》探讨了大型企业在拥抱颠覆性创新时所面临的挑战。 摩尔每年发表50至80场演讲,最近他重点关注企业IT投资从记录系统向交互系统的转变。 我将发布更多关于我们演讲者的信息。今年的全球峰会,演讲阵容很强大。 另外,你现在可以在我们的网站上建立你的会议和时间表。如果你还没有注册,可以点击马上注册.
文章
Michael Lei · 五月 15, 2022

InterSystems 最佳实践之 掌握 %SYSTEM.Encryption 加密类

InterSystems IRIS对加密、解密和哈希操作有很好的支持。在%SYSTEM.Encryption(https://docs.intersystems.com/iris20212/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&PRIVATE=1&CLASSNAME=%25SYSTEM.Encryption)类中,有市场上主要算法的类方法。 IRIS算法和加密/解密类型 正如你所看到的,这些操作是基于密钥的,包括3个类: 对称密钥: 进行加密和解密操作的部分共享同一个秘密密钥。 非对称密钥: 进行加密和解密操作的部分共享相同的秘密密钥进行加密。然而,对于解密,每个部分都有一个私人密钥。这个密钥不能与其他人共享,因为它是一个身份证明。 哈希: 当你不需要解密,而只需要加密时使用。当涉及到存储用户密码时,这是一种常见的方法。 对称和非对称加密的区别 对称加密使用一个单一的密钥,需要在需要接收信息的人之间共享,而非对称加密在通信时使用一对公共密钥和一个私人密钥来加密和解密信息。 对称加密是比较老的技术,而非对称加密则相对较新。 非对称加密的出现是为了补充对称加密模式中需要共享密钥的固有问题,通过使用一对公共-私有密钥来消除共享密钥的需要。 非对称加密比对称加密花费的时间相对较多。 主要区别 对称加密 非对称加密 密码文本大小 比原始纯文本文件更小的密码文本 比原始纯文本文件更大的密码文本 数据量 用于传输大数据. 用于传输小数据. 资源消耗 较低. 较高 密钥长度 128 或 256 位 RSA 2048位或者更长. 安全性 由于使用单一密钥进行加密,安全性较低。 由于在加密和解密中涉及两个不同的密钥,因此要安全得多。 密钥数量 加密和解密用单一密钥 加密和解密使用两个不同的密钥 技术 较老. 较新. 保密性 单一密钥,有可能被破解. 两个密钥分别用于加密和解密,从而消除了共享密钥的需要. 速度 较快 较慢. 算法 RC4, AES, DES, 3DES, QUAD. RSA, Diffie-Hellman, ECC . 来源: https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences 使用 %SYSTEM.Encryption 类来实现加密、解密与哈希 要行使IRIS对加密、解密和哈希操作的支持,请访问https://github.com/yurimarx/cryptography-samples,并遵循以下步骤: 1. Clone/git 将 repo 拉入任何本地目录 $ git clone https://github.com/yurimarx/cryptography-samples.git 2. 在目录中打开 Docker 终端并执行: $ docker-compose build 3. 启动 IRIS 容器: $ docker-compose up -d 4. 打开 IRIS 终端: $ docker-compose exec iris iris session iris -U IRISAPP IRISAPP> 5. 实现非对称RSA 加密: IRISAPP>Set ciphertext = ##class(dc.cryptosamples.Samples).DoRSAEncrypt("InterSystems") IRISAPP>Write ciphertext Ms/eR7pPmE39KBJu75EOYIxpFEd7qqoji61EfahJE1r9mGZX1NYuw5i2cPS5YwE3Aw6vPAeiEKXF rYW++WtzMeRIRdCMbLG9PrCHD3iQHfZobBnuzx/JMXVc6a4TssbY9gk7qJ5BmlqRTU8zNJiiVmd8 pCFpJgwKzKkNrIgaQn48EgnwblmVkxSFnF2jwXpBt/naNudBguFUBthef2wfULl4uY00aZzHHNxA bi15mzTdlSJu1vRtCQaEahng9ug7BZ6dyWCHOv74O/L5NEHI+jU+kHQeF2DJneE2yWNESzqhSECa ZbRjjxNxiRn/HVAKyZdAjkGQVKUkyG8vjnc3Jw== 6. 实现非对称 RSA 解密: IRISAPP>Set plaintext = ##class(dc.cryptosamples.Samples).DoRSADecrypt(ciphertext) IRISAPP>Write plaintext InterSystems 7. 实现对称 AES CBC 加密: IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCEncrypt("InterSystems") 8sGVUikDZaJF+Z9UljFVAA== 8. 实现对称AES CBC 解密: IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCDecrypt("8sGVUikDZaJF+Z9UljFVAA==") InterSystems 9. 实现MD5 哈希: IRISAPP>Do ##class(dc.cryptosamples.Samples).DoHash("InterSystems") rOs6HXfrnbEY5+JBdUJ8hw== 10. 实现SHA 推荐哈希: IRISAPP>Do ##class(dc.cryptosamples.Samples).DoSHAHash("InterSystems") +X0hDlyoViPlWOm/825KvN3rRKB5cTU5EQTDLvPWM+E= 11. 退出终端: Enter HALT or H (大小写不敏感) 关于源代码 1. 关于对称密钥 # to use with symmetric encrypt/decrypt ENV SECRETKEY=InterSystemsIRIS 在Dockerfile创建了一个环境密钥,作为对称操作的秘钥。 2. 关于非对称密钥 # to use with asymmetric encrypt/decrypt RUN openssl req -new -x509 -sha256 -config example-com.conf -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem 在Dockerfile创建了一个公钥和一个私钥用作非对称操作 3. 对称加密 // Symmetric Keys sample to encrypt ClassMethod DoAESCBCEncrypt(plaintext As %String) As %Status { // convert to utf-8 Set text=$ZCONVERT(plaintext,"O","UTF8") // set a secret key Set secretkey = $system.Util.GetEnviron("SECRETKEY") Set IV = $system.Util.GetEnviron("SECRETKEY") // encrypt a text Set text = $SYSTEM.Encryption.AESCBCEncrypt(text, secretkey, IV) Set ciphertext = $SYSTEM.Encryption.Base64Encode(text) Write ciphertext } AES CBC 加密主要用于加密文本。Base64编码将结果作为一个可读的文本返回给用户。. 4. 对称解密 // Symmetric Keys sample to decrypt ClassMethod DoAESCBCDecrypt(ciphertext As %String) As %Status { // set a secret key Set secretkey = $system.Util.GetEnviron("SECRETKEY") Set IV = $system.Util.GetEnviron("SECRETKEY") // decrypt a text Set text=$SYSTEM.Encryption.Base64Decode(ciphertext) Set text=$SYSTEM.Encryption.AESCBCDecrypt(text,secretkey,IV) Set plaintext=$ZCONVERT(text,"I","UTF8") Write plaintext } AES CBC 解密用于解密文本.Base64解码将加密后的文本返回为二进制文本,可以用来解密。 5. 非对称加密 // Asymmetric Keys sample to encrypt ClassMethod DoRSAEncrypt(plaintext As %String) As %Status { // get public certificate Set pubKeyFileName = "/opt/irisbuild/example-com.cert.pem" Set objCharFile = ##class(%Stream.FileCharacter).%New() Set objCharFile.Filename = pubKeyFileName Set pubKey = objCharFile.Read() // encrypt using RSA Set binarytext = $System.Encryption.RSAEncrypt(plaintext, pubKey) Set ciphertext = $SYSTEM.Encryption.Base64Encode(binarytext) Return ciphertext } 必须获得公钥文件内容,用RSA进行加密。RSA加密是用来加密文本的。 6. 非对称解密 // Asymmetric Keys sample to decrypt ClassMethod DoRSADecrypt(ciphertext As %String) As %Status { // get private key Set privKeyFileName = "/opt/irisbuild/example-com.key.pem" Set privobjCharFile = ##class(%Stream.FileCharacter).%New() Set privobjCharFile.Filename = privKeyFileName Set privKey = privobjCharFile.Read() // get ciphertext in binary format Set text=$SYSTEM.Encryption.Base64Decode(ciphertext) // decrypt text using RSA Set plaintext = $System.Encryption.RSADecrypt(text, privKey) Return plaintext } 要想用RSA解密,必须得到私钥文件内容。RSA解密的操作来解密文本。 7. 使用MD5的哈希文本(老方法) // Hash sample ClassMethod DoHash(plaintext As %String) As %Status { // convert to utf-8 Set text=$ZCONVERT(plaintext,"O","UTF8") // hash a text Set hashtext = $SYSTEM.Encryption.MD5Hash(text) Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext) // convert to hex text to following best practices Set hextext = ..GetHexText(base64text) // return using lowercase Write $ZCONVERT(hextext,"L") } MD5 哈希加密文本,并且不能被解密Hash will encrypt the text, and it will not be possible to decrypt it.新项目不建议使用MD5的哈希值,因为它被认为是不安全的。这就是为什么它被SHA所取代。InterSystems的IRIS支持SHA(我们的下一个例子将演示它)。 8. 使用SHA的Hash文本 (推荐) 我们将在这个样本中使用SHA-3哈希方法。根据InterSystems公司的文档,该方法使用美国安全哈希算法-3之一生成哈希值((更多信息见联邦信息处理标准出版物202)。 // Hash using SHA ClassMethod DoSHAHash(plaintext As %String) As %Status { // convert to utf-8 Set text=$ZCONVERT(plaintext,"O","UTF8") // hash a text Set hashtext = $SYSTEM.Encryption.SHA3Hash(256, text) Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext) // convert to hex text to following best practices Set hextext = ..GetHexText(base64text) // return using lowercase Write $ZCONVERT(hextext,"L") } 对于SHA方法,可以设置哈希操作中使用的比特长度。位数越多,破解哈希就越困难。然而,哈希过程也会变慢。在这个例子中,我们使用了256位。你可以选择以下长度: 224 (SHA-224) 256 (SHA-256) 384 (SHA-384) 512 (SHA-512)
文章
Lucy Ma · 五月 18, 2022

InterSystems IRIS商业智能:选择性构建

什么是选择性构建? 选择性构建是InterSystems IRIS (2020.1及以后)商业智能的一个功能。选择性构建允许仅构建模型中的指定元素,并且保持模型可以正常使用。 选择性构建有哪些特性? 在了解选择性构建的细节之前,一个简单的汇总在介绍关于在构建一个标准模型的不同阶段是重要的。这里列出了标准模型构建的过程阶段: 1)删除模型中已存在的数据 2)增添模型需要的全量数据 3)构建所有的索引 现在我们已经熟悉一个标准模型构建的过程,我们可以理解选择性构建的优势。在标准构建过程中,模型必须被停用,因为第一步是需要删除掉所有的已存在数据,接着再增添全量数据。这种情况不会发生在选择性构建中。选择性构建仅仅选择指定的模型元素停用,然后更新相应的数据到这些元素中。这意味着已经存在的数据并不会被删除。既然已经存在数据不会被删除,模型则不需要被停用。那些被选择构建的元素会被停用,表示如果用户想要查询这些停用的元素,他们会看到报错信息。 选择性构建的使用场景? 选择性构建是一种很好的方式用于更新数据模型,而不需要将整个模型停用来延长构建时间。基于模型的大小,一个模型有可能需要几个小时甚至几天来做全量的构建。如此长的构建时间仅仅为了增加一条新的维度减弱了频繁更改模型的灵活性。 如何使用? 从UI界面 在架构中,任何更改的元素都会被自动追踪。当你试图从UI界面构建模型,弹出的对话框会提供一个选项叫做选择性构建。这个选项是默认的,无论任何模型中的元素被更改需要重新构建。当然,如果你更想构建全部模型,也可以在这个界面选择。 构建模型接口 在构建模型的接口中有一个新的参数。这个参数在文档中被描述为:“pFactList是一个特殊属性的列表,存在于模型的事实表类中。如果pFactList被设定,构建过程会仅仅更新在这个事实列表中的行。这个列表可以用逗号分割或者用 $LB的格式。这个特殊的事实表更新时会被单独标记不可用于被搜索,以及与其相关的维度也不可用,否则的话则会收到报错提示。” 我会建议使用UI界面来部署模型的更改,接口方式用于部署关于系统层面的变更。 学习更多关于选择性构建,请参考文档。
文章
Hao Ma · 一月 15, 2021

基于InterSystems IRIS开发的RealWorld应用程序

假设您想编写一些真正的web应用程序,例如medium.com网站的简单克隆。这类应用程序可以在后端使用任何不同的语言编写,也可以使用前端的任何框架编写。编写这样一个应用程序有很多方法,你也可以看看这个项目。它为完全相同的应用程序提供了一堆前端和后端实现。您可以轻松组合它们,任何所选前端应该与任何后端搭配。 我来介绍一下这个使用后端InterSystems IRIS来实现后端的相同的应用程序。 RealWorld项目使用REST并提供预设swagger规范,以及Postman/Newman集合自动化测试。因此,它有助于实现完全相同的REST API。幸运的是,InterSystems已经实现了通过swagger规范生成REST API实现的方法。最佳实践在这里。 我实现这个应用程序的步骤是: 从swagger规范生成API 为应用程序中使用的每个对象类型添加一些持久类,包括 Users Articles Comments 实现API并用Postman测试 最后,用任何前端查看实际效果。 用 docker 启动 你可以自己使用docker 来实验一下。 // clone github repository git clone https://github.com/daimor/realworld-intersystems-iris.git cd realworld-intersystems-iris // build and run it with docker-compose docker-compose up -d --build 启动后可以通过URL http://localhost:12000/conduit获取IRIS中的REST API,可以用newman测试,需要已安装npm和npx包。 APIURL=http://localhost:12000/conduit ./run-api-tests.sh 运行Postman的相同测试 可以通过URL http://localhost/访问前端 可以通过zpm运行UnitTest,只需要进入iris会话 $ docker-compose exec server iris session iris Node: 0790684cf488, Instance: IRIS CONDUIT>zpm zpm: CONDUIT>test realworld [realworld] Reload START [realworld] Reload SUCCESS [realworld] Module object refreshed. [realworld] Validate START [realworld] Validate SUCCESS [realworld] Compile START [realworld] Compile SUCCESS [realworld] Activate START [realworld] Configure START [realworld] Configure SUCCESS [realworld] Activate SUCCESS [realworld] Test START Use the following URL to view the result: http://172.22.0.3:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=48&$NAMESPACE=CONDUIT All PASSED [realworld] Test SUCCESS zpm: CONDUIT> 默认使用Vue前端,但也能运行Angular和React web=angular docker-compose up -d --build web web=react docker-compose up -d --build web web=vue docker-compose up -d --build web 通过ZPM安装 InterSystems IRIS部分(后端)可以通过ZPM安装 USER>zpm zpm: USER>install realworld [realworld] Reload START [realworld] Reload SUCCESS [realworld] Module object refreshed. [realworld] Validate START [realworld] Validate SUCCESS [realworld] Compile START [realworld] Compile SUCCESS [realworld] Activate START [realworld] Configure START [realworld] Configure SUCCESS [realworld] Activate SUCCESS zpm: USER> 它将创建`/conduit` Web应用程序,只要设置正确的端口,也能用newman进行测试。 APIURL=http://localhost:52773/conduit ./run-api-tests.sh 可以用ZPM进行UnitTest zpm: USER>test realworld [realworld] Reload START [realworld] Reload SUCCESS [realworld] Module object refreshed. [realworld] Validate START [realworld] Validate SUCCESS [realworld] Compile START [realworld] Compile SUCCESS [realworld] Activate START [realworld] Configure START [realworld] Configure SUCCESS [realworld] Activate SUCCESS [realworld] Test START Use the following URL to view the result: http://172.17.0.2:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=4&$NAMESPACE=USER All PASSED [realworld] Test SUCCESS 备注 在开发这个项目的过程中,我遇到了一些问题。 %JSON.Adaptor 它在导入全新对象时效果非常好。但如果需要部分更新现有对象,则%JSONImport对于来源JSON中应该有的必需字段无效。 所以我没用%JSONImport更新对象,而是用了一个从传入的JSON到对象的简单集(如果定义了值)。 只能导出到字符串、流和输出设备。无法导出到原生JSON API需要返回被另一个对象(属性被命名为返回对象的类型)包装的任何对象。并用%JSONExportToString解决了这个问题,对于数组,将其转换为原生JSON 忽略空集合属性(如:数组和列表)的导出。虽然应用程序可能期望得到字段的空数组,但它根本没有得到任何字段 这个问题没解决。太棘手,只能在%JSON.Adapter端解决。 %REST - REST实现的生成器及REST实现本身 即使没有任何更改,`spec`类的任何编译都会更新`impl`类。因此,切记保持生成的部分(如:方法名、参数列表和变量名)不变,否则将会被下一次`spec`编译重写,这可能会在构建用于生产的应用程序时发生。 REST可以有`/users/` 端点,也能获取`/users/`请求,在这种情况下,两者效果相同。但如果只定义了第一种方式,REST就不能识别第二种方式。 要解决这个问题,必须修改swagger规范,只复制带新端点`/users/`的`/users/` Swagger规范定义了参数化请求的默认值,而生成器忽略了 在方法/生成器的代码中手动设置默认值可能会重写方法定义,而参数的设置默认值将被删除。所以可能在部署后破坏实现。 %REST.REST中的方法不可用于覆盖,仅由`disp`类使用,且将被`spec`类的编译完全重写。 无法访问实例的OnPreDispatch方法,也就无法进行更多控制,如:检查访问 Swagger规范定义了哪些端点是公共的,哪些需要授权。%REST生成器无法使用。 API必须用JWT来授权请求,且必须手动检查哪个端点需要检查访问。超出了%OAuth2实现的范围,在IRIS中使用JWT也很麻烦。 在`impl`类中生成的方法应该返回原生JSON对象、流或字符串。但我认为如果它也能接受%JSON.Adaptor对象就很好。 无论如何,实现这样的应用程序是非常有趣的。至少知道了可以用IRIS来实现。 这个应用程序使用了IRIS的这些特性 原生JSON + %JSON.Adaptor REST,及其遵守swagger规范的实现生成器 OAuth2的JWT 容器化 竞赛 这个项目正在参加InterSystems全栈竞赛,如果您喜欢请投票。