清除过滤器
文章
Hao Ma · 四月 18, 2021
IRIS相比Caché在部署上的一个进步是支持docker。即便不是云部署, 使用docker也带来非常多的便利。 尤其是在开发测试环节,由于docker的使用更便捷,除非要模拟客户的环境或者做规定的性能测试,我在测试中基本已经不再使用本机的实例或者虚机。IRIS的联机文档有[详细的IRIS docker安装使用指导](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_compose),本文只是一个简单的,快速上手的**在测试环境**安装IRIS docker的简单步骤,尤其适合初学者。
注意Windows上docker可能会遇到这样那样的问题,因此通常还是推荐在Linux或者Mac OS上使用。正式的生产环境的IRIS docker container也是不支持Windows系统的。
> Referrence
- [First Look: InterSystems Products in Docker Containers](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=AFL_containers)
- [Running an InterSystems IRIS Container: Docker Run ExamplesRunning an InterSystems IRIS Container: Docker Run Examples](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_dockerrun)
##1. 在操作系统上安装Docker环境
[Docker官方文档的安装步骤](https://docs.docker.com/engine/install/)非常清晰,我按照上面的步骤在MAC和CentOS上安装docker从来没有出现过问题。恰恰是这个文档中没有的Redhat上的安装,过程中曾碰到过几个问题,在网上搜索了答案,也不算困难。
简单的复述一下步骤:root用户的最简单安装,没有权限问题, 没有docker网络修改等等:
1. 安装yum-util, 用于添加yum源,如果您的系统中已经有了yum-utils包这步可以省略
sudo yum install -y yum-utils
2. 添加docker的Repo到yum源并确认
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum repolist
3. 安装3个docker组件
sudo yum install docker-ce docker-ce-cli containerd.io
4. 启动Docker
sudo systemctl start docker
5. 确认安装成功。'docker run'命令会去本地的库里找'hello-world',没有找到就去网上下一个"images",然后创建一个docker容器给你使用。
sudo docker run hello-world
安装结束您想要到注册一个账户,用来下载上传docker image。 下载命令使用'docker pull', 比如
```
docker pull nginx
```
## 2. 下载IRIS Docker image
在线文档[Container Images Available from InterSystems](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry#PAGE_containerregistry)中介绍了网站上可以下载的IRIS images的列表,其中community版本不需要license,其他的版本需要从InterSystems处获得IRIS docker版的专用license.
下面是登录并下载iris docker image的记录。从网页登录,您会得到docker的登录密码"使用的密码"jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb"。
[root@centos7 ~]# docker login -u="hma" -p="jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb" containers.intersystems.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@centos7 ~]# docker pull containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
2020.3.0.304.0: Pulling from intersystems/iris-ml
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
d21839215a64: Pull complete
7995f836674b: Pull complete
841ee3aaa7aa: Pull complete
739c318c2223: Pull complete
d76886412dda: Pull complete
Digest: sha256:4c62690f4d0391d801d3ac157dc4abbf47ab3d8f6b46144288e0234e68f8f10e
Status: Downloaded newer image for containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
[root@centos7 ~]#
另外,您也可以从InterSystems的技术支持网站下载iris docker的压缩包"iris*.tar.gz",然后使用"docker load"安装, 比如:
CNMBPHMA:~ hma$ docker load -i iris-2020.4.0.524.0-docker.tar.gz
## 3. 创建并运行IRIS Container
###简单的办法
如果是只是简单的测试,可以直接运行,但如果不是community版本的docker, 您还需要把license拷贝到container内部。 比如下面的步骤
CNMBPHMA:~ hma$ docker run -d -i -p 52773:52773 -p 51773:51773 --name iris20204 intersystems/irishealth:2020.2.0.211.0
CNMBPHMA:~ hma$ docker cp iris.key iris20204:/usr/irissys/mgr/iris.key
需要注意的是,不同版本的超级端口可能不同,有些是1972,有些是51773。为了省事,您也许可以使用"-P"把所有container内部的端口都映射出来。
除了要拷贝license到container内部,在做测试的时候,您可能还要经常的使用"docker cp"把各种测试文件拷入container。而且,当查看和修改container内部文件的使用,还需要使用下面的命令进入container内部:
CNMBPHMA:~ hma$ docker exec -it iris20204 /bin/sh
因此,如果是您需要一个经常使用的iris container环境,我还是建议您使用下面的方法。
### IRIS Container使用外部存储
简单的说,下面的命令
- 使用"--volume"参数为container创建外部存储,将host上的"/root/data/dur"文件夹和container内部的"/dur"文件夹链接起来。(/root/data/dur文件夹要在host上手工创建,这只是一个示意,您可以使用任何可用的目录)
- ISC_DATA_DIRECTORY环境设置会在创建iris container时在/dur文件夹下创建一个子目录”/dur/irisepy",所有IRIS运行的日志,客户配置,mgr目录下的用户数据都会保存在这个目录。因为"/dur"是外部存储,即使docker container被删除数据也不会丢失。这对container的重新创建或者iris升级都带来很大的方便。在线文档上对如果覆盖或者升级带有外部存储的iris container有详细的介绍。
- “key"参数定义了在IRIS container创建时会把"/dur/license"目录下的iris.key拷贝到iris安装目录的mgr下并激活。也就是说,在运行命令前, 您需要在host上在"/root/data/dur"目录下创建"license"子目录并将iris.key拷贝进去。
docker run --name irisepy --init -d\
-p 9091:1972 -p 9092:52773\
-v /root/data/dur:/dur\
--env ISC_DATA_DIRECTORY=/dur/irisepy \
containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 \
--key /dur/license/iris.key
希望您喜欢使用docker
文章
jingqi LIu · 三月 3, 2021
在InterSystems IRIS中使用ObjectScript构建REST API。
开发的API可以遵循OPEN API规范,可以使用Docker和VSCode开发,可以部署为ZPM模块,同时也可用作酒店超售系统的Data API。
什么是酒店超售管理系统?
超售管理系统结合了酒店的独特条件,例如房价,订购渠道,客户需求等。系统使用机器学习算法(例如:KNN / ES-RNN ...)来准确预测酒店的每日未入住和入住率,并进一步与收益方程式结合以找到最佳的最大客房销售量,从而可以大大增加酒店的边际收益。
来看看我们的Repo!
https://github.com/BroadCastAir/hotel_api
和
https://github.com/BroadCastAir/Hotel_OverBooking_Sys
投票支持我们的应用程序!
InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。
InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。说的好! 了解了,行业的应用证明了系统的可用性 希望多支持! 这是应用在其他行业中的典型案例,很棒! 看到了酒店行业应用,棒👍
公告
Claire Zheng · 十月 9, 2022
2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是作者获得“开发者社区奖”的关键!如何为你喜欢的作品投票呢?
第一步,你需要成为开发者社区的活跃用户(Active User)
成功注册后,在社区发帖、点赞、回复问题等,接下来需要……等24小时。因为我们的系统会每天进行一次active user的更新。
成为Active user后,就可以给你心仪的项目投票啦!
第二步,点击进入参赛页面🏆InterSystems开发者社区中文版首届技术征文大赛🏆
第三步,在参赛页面查看所有文章,看到感兴趣的文章,就可以点赞点赞,你可以为你喜欢的每篇文章点赞一次。
10月24日,我们将宣布获奖名单!
欢迎大家积极投稿、点赞、分享、学习!
欢迎关注InterSystems开发者社区中文版首届技术征文大赛
文章
王喆 👀 · 十一月 17, 2022
经过一段时间的学习和使用本文总结了一些使用VsCode开发的使用方法,本文偏向于应用但会对少量的我知晓的原理进行一部分解释。
参考教程链接:https://cn.community.intersystems.com/node/488611
VSCode下载:https://code.visualstudio.com/
使用VSCode开发的优劣:
1 优势:
跨平台(Windows|MAC|Linux)开发调试远程服务端代码,而且可以快速导出COS代码(M语言也可以)。
SQL辅助查询数据
快捷的代码调试方式,一种是直接在VSCode中调试,另一种是快速复制类名和方法名在Terminal中调试。
代码智能联想补全,类似其它语言,输入开头的前几个字符可以联想后面的。
快速跳转到方法定义(ctrl+鼠标左键 | F12)
主题图标多样化,可以使用默认的黑色,当然也可以使用和studio一样的样式,链接:https://cn.community.intersystems.com/node/516996
2 劣势:
无法导入导出XML文件
缺少一些Studio的常用功能:
SOAP向导
Java网关
DT转换拖拽编写
BP流程拖拽编写
安装步骤
1官网安装Visual Studio Code编辑器
https://code.visualstudio.com/Download
安装直接下一步 - 下一步
2 汉化
如果安装为英文要切换为中文则可以通过Command Palette 中运行Configure Display Language,install another language, 选择中文,再根据提示安装相应的语言插件。
3 扩展安装
打开软件,侧边栏点击扩展按钮->搜索 "InterSystems" -> 安装扩展,如图所示:
前三个是IRIS官方推荐按安装的插件,其中InterSystems ObjectScript Extension Pack (集成好的InterSystems插件包),在此还推荐安装SQL Tools InterSystems IRIS(连接数据库插件,使用效果类似于SQLdbx)
4 配置
VSCode支持图形化的配置,但实测并不好用,而且容易保存失败,在此推荐使用settings.json
打开:设置 -> 扩展 -> InterSystems Server Manager -> settings.json
{
"intersystems.servers": {
"loc": {
"webServer": {
"scheme": "http",
"host": "127.0.0.1",
"port": 52773
},
"askForPassword": false,
"username": "Superuser",
"password":"SYS",
"description":"228"
},
},
"terminal.integrated.detectLocale": "on",
"intersystems.language-server.diagnostics.routines": true,
"editor.renderControlCharacters": false,
"editor.unicodeHighlight.ambiguousCharacters": false,
"git.autorefresh": false,
"git.autoRepositoryDetection": false,
"git.confirmEmptyCommits": false,
"git.confirmForcePush": false,
"git.confirmNoVerifyCommit": false,
"git.confirmSync": false,
"git.countBadge": "off",
"diffEditor.wordWrap": "on",
"editor.wordWrap": "on",
"workbench.colorTheme": "InterSystems Default Dark",
"workbench.editor.enablePreview": false,
"vsicons.dontShowNewVersionMessage": true,
"git.enableSmartCommit": true,
"explorer.confirmDelete": false,
"editor.fontSize": 13,
"objectscript.conn": {
"host": "127.0.0.1", // 连接数据库IP
"port": 57772, // 连接数据库端口
"username": "Superuser", // 用户名
"password": "SYS", // 密码
"ns": "BKlinik", // 命名空间
"active": true, // 是否开启
"https": true,
"server": "bklinik" // intersystems.servers中设置的数据库服务器名
},
"sqltools.connections": [
{
"namespace": "BKlinik",
"connectionMethod": "Server and Port",
"showSystem": false,
"previewLimit": 50,
"server": "localhost",
"port": 52773,
"askForPassword": false,
"driver": "InterSystems IRIS",
"name": "BKlinik",
"username": "Superuser",
"password": "SYS"
}
],
"intersystemsServerManager.credentialsProvider.deletePasswordOnSignout": "never",
}
这是我目前使用的:
intersystems.servers :指的是IRIS的服务器的设置,内部的服务器命名不可大写,相比较官方出具的设置,我增加了【"askForPassword": false, "password":"123456",】此处的增加是方便后面打开代码的时候不需要再输入密码。
5 打开代码
打开代码有两种方式:一种是直连代码打开,另一种是客户端方式连接,第一种相当于studio直接连着代码进行编辑,第二种是把代码下载到本地磁盘的对应目录进行编辑。第一种方式好处是完全无感的查看编辑代码,但是如果不小心删掉之后无法恢复。第二种方式删掉之后可以恢复,而且也可以用GIT等代码版本控制,但是如果多人同时编辑代码,可能会存在冲突覆盖的情况。
直连代码
Instersystems tools – All Servers – 【服务器名】– NameSpace – 命名空间
然后你就可以愉快的编辑代码了
客户端方式打开
首先,你得建立一个文件夹,如图:本文是在D://workspace建立的一个aaa文件
点击打开文件夹 – 选择对应文件
此时会出现一个IRIS的图标,ObjectScript,如图所示:
点击ObjectScript – Choose Server and Namespace – 选择对应的服务器
再选择你需要的命名空间 比如我这边选择的是【HSLIB】
选择你需要编辑的代码 - 右键 - 选择Export
输出的框里会显示导出详情,如下图所示:
等待导出完毕,回到代码编辑,你的代码会出现在src目录下,如图所示:
如果你了解过ZPM的话,你现在还可以在这边添加一个module.xml,方便你把这个代码导入到其它机器上,ZPM相关的知识可以去GitHub上看看,关键就两个命令 [zpm] [load -v 【路径】] 和一个文件的编写,特别好用的是导入发布订阅和查找表,导代码的话得保证你的代码一行都没有问题,如果你的代码在使用的时候跨命名空间做了一些操作的话ZPM也会报错。
如何配置GIT的话,可以通过命令行的方式在本地文件上配置,也可以在VSCode上处理,和其它代码的处理方式差不多。
如果你安装了【SQL Tools InterSystems IRIS】那么上述配置中的sqltools.connections就是你需要的连接配置,你可以尝试改成你自己的库,然后进行一些简单的SQL操作。当然个人还是推荐使用DBeaver,这个更好用。
总结
好了,以上就是如何进行VSCode开发的我的一些小分享,如果有纠正请联系!!!
非常棒的文章! 补充InterSystems使用VSCode开发的官方文档 Welcome to the VS Code InterSystems ObjectScript documentation - InterSystems ObjectScript for VS Code (intersystems-community.github.io) 可以通过下面网址直接打开SOAP 向导页:
{serverurl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace={namespace}
比如:http://localhost:52779/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace=MyTest
也可以在VSCode里添加用户自定义的快捷键:
"objectscript.conn": {
"links": {
"Portal Explorer": "${serverUrl}/csp/sys/exp/%25CSP.UI.Portal.ClassList.zen?$NAMESPACE=${ns}",
"SOAP Wizard": "${serverUrl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?$NAMESPACE=${ns}"
},
}
参考文档:https://intersystems-community.github.io/vscode-objectscript/configuration/#server-actions-menu
另:BPL,DTL一般直接在浏览器中进行编辑,完全不需要VSCode。 感谢 感谢 学到了
文章
Qiao Peng · 三月 29, 2021
一些熟悉SQL的用户希望用SQL表的方式获取InterSystems IRIS/Caché的变更数据。知道了Global和SQL表的对应关系,就可以知道是哪一张SQL表数据变化了,甚至通过SQL查询获取变更的数据。下面介绍如何实现这种方式,和注意事项。
获取Global和SQL表的对应关系
通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系;而持久化的对象模型和Global之间也有一一对应关系。建立Global和SQL表的对应关系,通常可以使用以下的SQL查询特定SQL schema下所有表对应的Global:
SELECT CC.SqlQualifiedNameQ SQLTable, CS.parent Class, CS.DataLocation
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC
WHERE CS.parent = CC.ID
AND CC.SqlSchemaName= <schemaname>
其中<schemaname>是SQL的Schema名称; 返回字段SQLTable是SQL表名、Class是对象类名、DataLocation是保存数据的Global名称。
多种建模方式Global和SQL表的对应关系的影响
InterSystems IRIS/Caché都是支持多种建模方式的数据平台,常见的建模方式有SQL、面向对象、多维数组。如果之前不了解InterSystems IRIS/Caché的多维数组,可以先简单理解为键值对。无论使用何种建模方式,都可以得到3套模型:SQL模型、对象模型和多维数组存储模型(Global模型)。上面提到通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系。但由于SQL表达模型的局限性, InterSystems IRIS/Caché的对象模型和SQL表之间并不总是一一对应的关系。
下面就逐一分析各种建模方式下,如何分析和获取Global和SQL表的对应关系。
1. 基于SQL建模
如果InterSystems IRIS/Caché模型就是用SQL建模的,查找Global和SQL表的对应关系很简单:对象模型是基于SQL模型自动创建的,因此它们之间是一对一的关系。这是,在Caché里,编译出的Storage 类型为%Library.CacheStorage;在InterSystems IRIS里,编译出的Storage 类型为%Storage.Persistent。
可以执行SQL查询:
SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC
WHERE CS.parent = CC.ID
AND CC.SqlSchemaName= <schemaname> AND type='%Library.CacheStorage'
其中<schemaname>是SQL的Schema名称,如果Schema里有“_”,应将其去掉。Parent字段是SQL表对应的类名,DataLocation是保存数据的Global名称。而Global的第一个下标就是行号/Id字段。
例如使用DDL创建一个table:
Create table Demo.Mytable(name varchar(20), notes varchar(100))
通过上面的SQL查询,DataLocation为Demo.MytableD。那么Journal中所有对于Global为Demo.MytableD的操作就是对表Demo.Mytable的记录操作。例如^Demo.MytableD(123), 就是对行号/Id字段为123的Demo.Mytable记录到操作,从而可以通过SQL: SELECT name, notes from Demo.Mytable WHERE id = 123 获取这条变更的记录。
2. 基于对象建模
如果InterSystems IRIS/Caché模型是使用对象建模的,查找Global和SQL表的对应关系有时并不那么简单。例如以下描述患者及地址的简单对象模型:
Class Demo.Address Extends %SerialObject
{
Property Type As %String;
Property City As %String;
Property Street As %String;
Property RoomNo As %String;
}
Class Demo.Patient Extends %Persistent
{
Property Name As %String;
Property Gender As %String;
Property DOB As %Date;
Property Addresses As list Of Demo.Address(SQLPROJECTION = "table", STORAGEDEFAULT = "array");
}
因为患者可能有多个地址,因此Demo.Patient类用以列表类型(list)描述地址属性。其中地址Demo.Address对象模型是通过被引用的持久化对象来序列化的,此处引用它的持久化对象类就是Demo.Patient。Demo.Address类并没有独立的Global保存其数据,它的数据是保存在Demo.Patient的Global中的。
这个对象模型很容易理解,以对象方式在InterSystems IRIS/Caché里也很容易操作数据。但SQL的二维表无法表达这样稍微复杂一点的模型,因此需要将患者的地址投射为一张地址表,并用主外键将地址表和患者表的记录关联起来。
上面的患者对象模型中Addresses属性的SQLPROJECTION和STORAGEDEFAULT参数就是将属性Addresses投射为一张SQL表。
编译后,这个患者对象模型,在SQL上会投射出两张表:患者表:Demo.Patient地址表:Demo.Patient_Addresses注意:SQL表Demo.Patient_Addresses并不是由对象类Demo.Address投射而来,它是由对象类Patient的列表类型的属性Addresses投射而来。对象类Demo.Address是序列化类,它并不会投射SQL表。
执行SQL查询
SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC
WHERE CS.parent = CC.ID
AND CC.SqlSchemaName= 'Demo'
将返回类似如下结果:
SQLTable
Class
DataLocation
Demo.Patient
Demo.Patient
^Demo.PatientD
Demo.Patient_Addresses
Demo.Patient
注意:SQL表Demo.Patient_Addresses并没有对应的Global,因为它的数据是保存在Patient的Global里的。
这时可以使用以下SQL查询获取SQL表Demo.Patient_Addresses对应的Global和下标:
SELECT CC.ID||'_'||CSD.Attribute as SQLTable, CS.parent as Class, CS.DataLocation, CSD.Structure, CSD.Subscript
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC, %Dictionary.CompiledStorageData CSD
WHERE CS.parent = CC.Name
AND CS.ID1 = CSD.parent
AND CC.SqlSchemaName= 'Demo'
AND CC.ID||CSD.Attribute in (select parent from %Dictionary.CompiledStorage where DataLocation is null)
它返回类似如下结果:
SQLTable
Class
DataLocation
Structure
Subscript
Demo.Patient_Addresses
Demo.Patient
^Demo.PatientD
subnode
“Addresses”
这说明SQL表Demo.Patient_Addresses的数据放在Global ^Demo.PatientD的下标为"Addresses"的子节点下。所以对Global节点 ^Demo.PatientD(“Addresses”)的数据变更就是对SQL表Demo.Patient_Addresses的数据变更。
类似的,当创建对象模型的父子关系时,父子关系子方的数据可以保存在父方的Global中。如以下模型:患者模型
Class Demo.Patient Extends %Persistent
{
Property Name As %String;
Property Gender As %String;
Property DOB As %Date;
Property Addresses As list Of Demo.Address(SQLPROJECTION = "table", STORAGEDEFAULT = "array");
Relationship Encounters As Demo.Encounter [ Cardinality = children, Inverse = Patient ];
}
就诊模型,它和患者模型是父子关系
Class Demo.Encounter Extends %Persistent
{
Property EncounterNo As %String;
Property VisitDate As %Date;
Relationship Patient As Demo.Patient [ Cardinality = parent, Inverse = Encounters ];
}
执行SQL查询
SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC
WHERE CS.parent = CC.ID
AND CC.SqlSchemaName= 'Demo'
将返回类似如下结果:
SQLTable
Class
DataLocation
Demo.Encounter
Demo.Encounter
{%%PARENT}(“Encounters”)
Demo.Patient
Demo.Patient
^Demo.PatientD
Demo.Patient_Addresses
Demo.PatientAddresses
这说明SQL表Demo.Encounter的数据放在Global ^Demo.PatientD的下标为" Encounters"的子节点下。所以对Global ^Demo.PatientD(“Encounters”)的数据变更就是对SQL表Demo.Encounter的数据变更。
3. 基于Global建模
直接基于Global建模并不常见。如果是直接基于Global建模的,可以在Global模型的基础上再建立对象模型,这样数据不仅可以使用多维数组方式操作,也可以通过对象和SQL方式操作。
这种情况下的对象模型,使用的Storage 类型在Caché里为%CacheSQLStorage,在InterSystems IRIS里为%Storage.SQL。
例如如下使用%CacheSQLStorage的Caché对象类Demo.Department:
Class Demo.Department Extends %Persistent [ StorageStrategy = SQLStorage ]
{
Property Id As %Integer;
Property Name As %String;
Property Parent As Demo.Department;
Index MyId On Id [ IdKey ];
Storage SQLStorage
{
<SQLMap name="DataMap">
<Data name="Id">
<Delimiter>"^"</Delimiter>
<Node>"id"</Node>
<Piece>1</Piece>
</Data>
<Data name="Name">
<Delimiter>"^"</Delimiter>
<Node>"Name"</Node>
<Piece>1</Piece>
</Data>
<Data name="Parent">
<Delimiter>"^"</Delimiter>
<Node>"Parent"</Node>
<Piece>1</Piece>
</Data>
<Global>^MyDepartment</Global>
<RowIdSpec name="1">
<Field>Id</Field>
</RowIdSpec>
<Subscript name="1">
<Expression>{Id}</Expression>
</Subscript>
<Subscript name="2">
<Expression>"Dep"</Expression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^Demo.DepartmentS</StreamLocation>
<Type>%CacheSQLStorage</Type>
}
}
对于这种使用%CacheSQLStorage或%Storage.SQL的对象类所投射出的SQL表,可以使用以下SQL查询获取SQL表对应的Global和下标:
SELECT CC.SqlQualifiedNameQ as sqltable,
CC.id as class, CSM._Global as DataLocation, CSM.Structure, CSMS.Name as subscript,CSMS.Expression
FROM %Dictionary.CompiledStorage CS,
%Dictionary.CompiledClass CC,
%Dictionary.CompiledStorageSQLMap CSM,
%Dictionary.CompiledStorageSQLMapSub CSMS
WHERE CS.parent = CC.ID
AND CS.ID1 = CSM.parent
AND CSM.ID = CSMS.parent
AND CSM.Type='data'
AND CC.SqlSchemaName= <schemaname>
其中<schemaname>是SQL的Schema名称。它返回类似如下结果:
SQLTable
Class
DataLocation
Structure
Subscript
Expression
Demo.Department
Demo.Department
^MyDepartment
1
{Id}
Demo.Department
Demo.Department
^MyDepartment
2
“Dep”
说明SQL表Demo.Department的数据保存在^MyDepartment 中,并且放在2个下标下,第一维下标为Id字段,第二维下标为字符串常量"Dep"。
这时,可以通过^MyDepartment的第一维下标(字段Id)值,执行SQL语句获取变更的整条记录:
SELECT * FROM Demo.Department WHERE id=?
使用%CacheSQLStorage/%Storage.SQL为Storage类型的InterSystems IRIS/Caché对象类,其Global模型可以任意灵活,而且不影响对象操作和SQL操作。但这也提高了将Global变更对应到SQL表的难度。
总结
通过上面的分析,如果要从InterSystems IRIS/Caché中通过SQL方式分析数据变更,需要先了解其建模方式,分析Global对应SQL表的关系。可以建立一张SQL表,存储分析得到的Global及下标和SQL表对应关系。当通过Dejournal filter发现global数据变更时,查询该SQL表,将数据变更表达为对应SQL表和对应记录(RowID),从而使用SQL获取完整的变化记录。
其它注意事项:流类型的属性/字段,通常保存在名为S的Global内,因此这些Global的数据更新也应该捕获并转换为对应SQL表的数据变更记录。
CDC系列
更多的CDC选项实现,请参考:
1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能
2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC
3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系
4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能
公告
Michael Lei · 五月 8, 2021
在这个一小时的互动课程中,用户可以参与了涉及多个Docker容器的复合应用程序的开发。此外,学员们还学习如何创建数据转换和业务规则,使用业务流程设计器来建立病人护理的逻辑,并使用Spark和PMML将业务操作与机器学习模型连接起来。
赶快来参加我们的线上课程吧:
https://learning.intersystems.com/course/view.php?id=1662&ssoPass=1
只有受众组'1.0 HealthShare Content Access'的成员可以自主选课 请问您的账户可以看其他课程吗?
文章
Hao Ma · 三月 25, 2021
在Caché时代, 比较受欢迎的IRIS数据库客户端是Sqldbx和Winsql, 这两者的共同点是提供ODBC兼容的连接,而且免费。限制也差不多:只能用于Windows环境,只能用ODBC连接。
DBeaver是我最近使用的免费SQL客户端, 推荐给各位。它有几个好处:
1. 支持各种操作系统:Windows, Linux, Mac.
2. 内置Caché和IRIS的JDBC driver, 可以简单配置到Caché 或者IRIS的连接。
3. 免费
下面说说配置的一些小细节:
- 连接IRIS
下图中的配置项都很简单,需要的信息无非是数据库IP地址, 端口,数据库的名称,以及账号密码。值得一说的是下面下拉栏里的InterSystems IRIS driver. 初始安装DBeaver时这个driver不是默认安装好的, 你需要到"Edit Driver Setting"的"Libraries"页面去下载,按钮是"Download/Update". 下载的地址是https://github.com/intersystems-community/iris-driver-distribution/raw/main/intersystems-jdbc-3.1.0.jar。 讨厌的是,这个页面的响应速度有点慢,因此您很可能会被timeout。我的解决方法是拷贝这个网址,从浏览器把这个包下来,然后放到DBeaver指定的路径去。上述地址和要放的文件路径都可以在”Driver Setting"的"information"页面得到。
-连接Caché
这个就容易多了。 虽然也有可能要下载driver, 但Caché的driver是已经存在Dbeaver网站的repo里面了,不会有下载和更新timeout的问题。 (我相信用不了多久IRIS的driver也会放进DBeaver的repo的)
happy coding
马老师好,请教个问题,就是我按照步骤操作之后,连接还是提示Connection refused: connect,驱动我是从本地安装目录拷贝出来的(D:\IRIS-HealthConnect\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar),这个可能会是什么问题
文章
Qiao Peng · 二月 18, 2022
在InterSystems IRIS和InterSystems Caché 里,是否您遇到过执行一个SQL Insert/Update语句,明明给的是正确的日期值,但被告知“值‘2022-01-01’ 校验失败”的类似情况,并感到困惑?
如果有,那么您需要了解一下InterSystems IRIS和InterSystems Caché保存和显示数据的模式。
一 数据模式
InterSystems IRIS和InterSystems Caché里,数据有3种模式,称之为SELECT MODE:逻辑模式:这是数据被保存到InterSystems IRIS和InterSystems Cache'时的格式。例如,%Date类型的数据,在数据库里被保存为一个整数,即从1840年12月31号到这个日期的天数,而不是YYYY-MM-DD的格式。
ODBC模式:这是ODBC对数据定义的格式。在这个模式下,%Date类型的数据就会显示为YYYY-MM-DD的格式。
显示模式:这是数据在InterSystems IRIS和InterSystems Caché里默认的显示格式。例如在美国语言环境下,%Date的默认显示格式是DD/MM/YYYY格式。
InterSystems IRIS和InterSystems Caché只会使用逻辑模式保存数据,但可以以任何模式显示数据。
二 数据类型与数据模式
大多数数据类型在3种数据模式下的格式是一样的,例如%String、%Integer等。但有些情况下,数据在不同数据模式下的格式是不一样的:
时间、日期类型的数据
InterSystems提供多种时间、日期数据类型,包括%Date、%Time、%PosixTime、%TimeStamp 和%MV.Date。除了%TimeStamp,这些时间日期数据类型的3种数据模式下的格式都是不同的。
列表类型的数据
作为一个多模型数据库,可以指定数据为列表类型(%ListOfDataTypes)。列表类型数据的在不同数据模式下的格式也是不同的。例如一个定义为list of %String的属性/字段,中文数据以显示模式和ODBC模式看,数据显示是没问题的,但逻辑模式下看似乱码(其实并非乱码)。
指定了VALUELIST 和 DISPLAYLIST的数据
例如在建立患者模型时,我们指定其性别数据类型为%String,但通过VALUELIST限定它的值只可以是0、1、2、9,通过DISPLAYLIST设置这4个值的显示值为“未知的性别"、 "男性"、"女性"、"未说明的性别"。这样,数据被保存到数据库时,保存的是0、1、2、9,而显示值和ODBC值都是中文说明。
空字符串和空字符流数据
在逻辑模式下,空字符串和 空BLOB 由不可显示的字符 $CHAR(0) 表示。在显示模式下,它们由一个空字符串 ("") 表示。
三 SQL与数据模式
InterSystems提供很多种SQL操作的方式,而其当使用SQL操作数据的时候,很多操作和数据模式有关,例如数据排序。
SQL操作的方式
您是如何使用SQL的?是通过ODBC/JDBC,还是在Object Script里通过嵌入式SQL或动态SQL,抑或是通过Terminal或管理门户的SQL操作页面?
1. ODBC/JDBC
通过ODBC/JDBC连接到InterSystems数据库时,问题很简单:无论是插入或更新数据,还是查询数据,作为值、查询条件的数据和返回的数据显示结果都是按ODBC格式的。也就是说,这种情况下,您不需要关心数据模式。
2. 嵌入式SQL
如果您在使用嵌入式SQL(&SQL)操作数据,那么就需要留心数据模式了。可以通过#SQLCompile Select这个预处理器指令设置需要的数据模式,例如设置为ODBC模式:
ClassMethod Test(pDocNo = "Doc123456")
{
#SQLCompile Select=ODBC
&SQL(Insert into Test.Table(
DocumentNo,
DOB,
name_Value)
values(
:pDocNo,
'2001-10-10',
'预防接种史描述')
)
}
#SQLCompile Select可以设置为逻辑模式(Logical)、显示模式(Display)、 ODBC模式(ODBC)或 运行时模式(RuntimeMode)。而RuntimeMode默认为逻辑模式。
3. 动态SQL
如果是使用动态SQL,对于%SQL.Statement,它有一个属性%SelectMode,可以用来设置数据模式。它的可选值为:0 (逻辑模式)、1 (ODBC模式) 、2(显示模式),0(逻辑模式)是默认值。
例如下面的例子将数据模式设置为逻辑模式:
SET myquery = 3
SET myquery(1) = "SELECT {t '12:04:29'} AS time1,"
SET myquery(2) = "{t '12:4:29'} AS time2,"
SET myquery(3) = "{t '12:04:29.00000'} AS time3"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=0
SET tStatus = tStatement.%Prepare(.myquery)
SET rset = tStatement.%Execute()
DO rset.%Display()
4. Terminal的SQL shell
当使用Do $System.SQL.Shell()进入Terminal的SQL操作环境时,可以使用SET SELECTMODE命令来查询和设置数据模式。
直接使用SET SELECTMODE命令,返回的是当前数据模式。要设置数据模式,使用SET SELECTMODE=odbc/logic/display,例如SET SELECTMODE=odbc将当前SQL操作环境的数据模式设置为ODBC模式。
注意:SET SELECTMODE=odbc,等号前后不能有空格!
5. 管理门户的SQL操作页面
在管理门户的SQL操作页面中,通过下拉列表来选择当前的数据模式。
例如下面的逻辑模式的数据显示结果:
这是相同的数据在显示模式下的数据显示结果:
6. 在同一个SQL语句中显示不同的数据模式
有可能出于某种原因,你希望在SQL语句中对不同的字段使用不同的数据模式。这时,可以使用SQL函数:%EXTERNAL、%INTERNAL和 %ODBCOUT 来控制输出模式。
%EXTERNAL:按显示模式输出表达式结果%INTERNAL:按逻辑模式输出表达式结果
%ODBCOUT :按ODBC模式输出表达式结果
例如对于相同的数据,我们采用不同的数据模式输出:
那么除了显示和赋值,哪些操作和数据模式相关呢?
和数据模式相关的操作
1. 比较谓语
在where子句中进行比较的谓语,包括=、>、<、BETWEEN和 IN,这些比较谓语操作时,都会用逻辑模式的值进行比较操作,但可以通过SQL函数做其他数据模式到逻辑模式的数据转换。
例如,我们做日期类型的比较,当前的数据模式是ODBC模式,mydate是ODBC模式,比较条件值也应该是ODBC模式,可以这样写:
... WHERE mydate > '2010-01-01'
而如果数据模式是逻辑数据模式,上面的SQL写法将不会得到你想要的结果,因为这时mydate是逻辑模式的值。你可以用SQL函数TO_DATE将ODBC格式的日期值转为逻辑值:
... WHERE mydate>TO_DATE('2010-01-01','YYYY-MM-DD')
2. 模式谓语在where子句中进行模式分析的谓语,包括%INLIST、 LIKE、 %MATCHES、 %PATTERN、 %STARTSWITH、 [ (包含操作符) 和 ] (跟随操作符),这些模式分析操作也是用逻辑值进行比较,但不能用SQL函数进行其他模式到逻辑模式的转换。
当然,你可以考虑用模式转换函数将数据转换为字符串进行模式分析,例如下面的SQL使用%ODBCOUT将mydate转为ODBC格式的字符串,并看其模式是否满足以“2010-”开头。
...WHERE %ODBCOut(mydate) %STARTSWITH '2010-'
注意,这时SQL引擎不会使用mydate上的索引,有可能造成性能降低。
3. 排序操作
无论使用哪种数据模式,ORDER BY 都使用逻辑模式的值进行排序。
文章
TZ Zhuang · 六月 2, 2021
InterSystems产品有四种备份方法:(1) 外部备份(2) 在线备份(3) 冷备份(4) 传统的并行外部备份有关这些方法的细节请参考在线文档 https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_BACKUP
以下是对每种备份方法的简要描述:
(1) 外部备份外部备份是InterSystems推荐的最佳备份方式。外部备份一般是对数据库文件所在的存储创建快照的方式来实现。创建快照可以在多个层面进行,例如存储层面,操作系统层面,等等,因此这些相关技术和工具一般由第三方来提供。在做快照前,一定要先停止对数据库文件的写入(InterSystems IRIS的IRIS.DAT,Caché/Ensemble的CACHE.DAT)。但是用户进程可以继续对内存进行更新,而不需要中断。InterSystems提供了停止对数据库文件写入的方法,用户可以把这个加入到快照工具的脚本里。外部备份一般包括以下几步:1. 使用Backup.General.ExternalFreeze()方法来停止对数据库文件的写入。2. 使用第三方快照工具来对文件系统创建快照。3. 使用Backup.General.ExternalThaw()方法来恢复对数据库文件的写入。4. 把快照拷贝到备份介质上(用于存储备份的磁盘,磁带,等等)。5. 删除快照。
(2) 在线备份在线备份是InterSystems自己特有的备份方式,可实现无宕机备份。但是,在线备份只能备份数据库文件(InterSystems IRIS的IRIS.DAT,Caché/Ensemble的CACHE.DAT),并且会把所有需要备份的数据库文件中的数据块写入到一个.cbk的备份文件。因此如果想要使用在线备份来备份整个系统环境,除了数据库文件外,还需要额外备份很多系统文件,例如InterSystems产品的安装目录,WIJ文件,主日志和备日志目录等等。在线备份包括3种类型:1. 全备份 -- 把所有使用的数据块写入到一个.cbk文件。2. 累积备份 -- 从上一次全备份起,所有变化过的数据块写入到一个.cbk文件。恢复时,需要和上一次全备份一起恢复。3. 增量备份 -- 从上一次备份起,所有变化过的数据块写入到一个.cbk文件。恢复时,需要和上一次全备份及中间所有备份一起恢复。在线备份的这些特性,并不适用于作为数据量大的生产系统的备份方案。
(3) 冷备份冷备份是在数据库系统正常停机状态下,所做的外部备份,即拷贝文件系统到存储介质。
(4) 传统的并行外部备份传统的并行外部备份是一种在特殊情况下才可行的备份方法。一般需要满足以下条件:1. 数据库在一个集群里,并且不能有宕机时间。2. 没有快照功能。3. 在线备份不能满足需求。并行外部备份结合了数据库文件(*.DAT)拷贝和在线备份里增量备份的功能。其步骤如下:1. 在数据库中设置备份启动标志。2. 拷贝数据库文件(*.DAT)。3. 对该拷贝时间内被修改的数据进行在线备份的增量备份。具体使用情况和详情也请参考在线文档 https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GCDI_backup#GCDI_backup_methods_ext_concurrent
最新版本InterSystems IRIS for Health示例:===============================================================1. 设置标志,开始备份数据库。Set ^ClearOK=$CLRINC^DBACK("QUIET")2. 拷贝操作系统上的数据库文件(*.DAT)。3. 运行下面的命令,表明你已经使用了一个外部备份工具。Set x=$$BACKUP^DBACK("","E","Dirty external backup","","","")4. 进行增量备份。Set x=$$BACKUP^DBACK("","I","incremental","test.cbk","Y","bck.log","QUIET","Y","Y")===============================================================InterSystems产品中的上述处理可以做成例程Routine或类方法,并与批处理相结合进行操作。关于传统并行外部备份中使用的^DBACK例程的更多信息,请参考以下文件https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GCDI_backup#GCDI_backup_util_DBACK_entry_backup
公告
Claire Zheng · 六月 13, 2022
SUTA培训是InterSystems专为SUTA有效期客户提供的原厂产品技术服务,具体包括产品的基础管理、编程管理、高级管理和开发培训等。即日起2022 SUTA培训报名启动,本年度为针对InterSystems数据平台产品的线上培训,一共6期12个课程,其中每期两个课程,时间安排在周五下午半天(6月24日—8月5号),6期培训总时长共计三天。点击此处报名,或者扫描下图中的二维码报名,在您的报名信息经过审核后,我们会与您进一步沟通线上培训细节。快来报名吧!
点击下载,了解2022 SUTA培训课程安排详情。
文章
Tingting Jiang · 三月 21, 2023
注意:请投递时,发送英文简历!
工作概述
每年夏天InterSystems都会招聘实习生在中国办公室工作,从事专门围绕InterSystems产品设计的项目。我们信任实习生团队在导师的指导下可独立的工作。除了在项目中工作外,实习生还能融入我们的团队,与我们的全职员工一起解决所面对的工作问题。
InterSystems的带薪暑期实习项目可以让学生接触到在重要的职业生涯中出类拔萃所需的各种技术和软技能。
我们希望实习生可以累计工作时长4个月,预计于2023年6月份开始。
工作职责
参加必要的培训课程,成功完成实习期间分配的项目。
在导师和其他InterSytems员工的指导下,成功地完成分配给他们团队的项目。
向高层领导和InterSystems的员工展示他们的项目。
遵守实习计划的所有要求(包括出勤、着装、行为)。
遵守公司关于实习的合理指示。
在公司规定的时间内可以进行活动。
如果在实习期间有任何计划外的缺席,请及时通知人力资源部门。
遵守适合公司的职业行为标准。
遵守公司的政策和程序,包括那些与WHS和就业公平和多样性有关的政策和程序。
在任何时候都要适当地、负责任地使用公司的资源。
承担所有与实习有关的评估活动。
对在实习期间获得的有关公司、员工、客户和公司业务的信息进行保密。
公司可能不时地指示其他职责。
任职条件
优先有以下一种或多种编码经验:Python、InterSystems ObjectScript、Node.js、SQL、XSLT和AngularJS在敏捷团队中工作,或类似的经验。
技术上的好奇心。
对复杂的技术挑战有创造力。
协作的团队心态。
在不断变化的工作环境中表现出灵活的态度。
主动为自己的职业生涯打下技术基础。
专业要求
计算机等相关专业的本科生、硕士生或者博士在读学生。
薪资
本科生:RMB6,000/月;硕士生:RMB7,000/月;博士生:RMB8,000/月。
工作地点
北京市朝阳区建国门外大街1号银泰中心写字楼C座2701
如何申请
请点击链接InterSystems Careers, 或在2023年4月30日前发送邮件至recruitment.asiapacific@intersystems.com。
不知道我可不可以 你可以给实习生当老师 哈哈哈哈
公告
Claire Zheng · 五月 9, 2021
亲爱的社区开发者们,
我很高兴地向大家介绍一位我们的新版主@刘文艺。
@刘文艺在嘉和美康(北京)科技股份有限公司任职集成平台研发部产品经理。
以下是@刘文艺的自我介绍:
大家好,我带领团队主导了多家大型医院的信息平台开发、系统集成和互联互通项目,有丰富的基于InterSystems产品的开发、部署和项目经验,对医疗信息行业有很深的认识和独特的想法,熟悉医疗行业相关标准,并获得HL7认证证书,和InterSystems技术认证证书。
本人乐于参与组织各种活动,分享经验,协作能力强,善于与人交流,很荣幸在InterSystems开发者社区(中文版)与大家相识,今后希望通过与大家共同努力,不断完善开发者社区的内容建设,提高社区人气的活跃度和忠诚度。让社区更好地为开发者提供知识传播、在线学习等服务。
感谢@刘文艺,恭喜你成为新版主! 热烈欢迎!
欢迎欢迎! 欢迎刘文艺! 作为国内首位开发者大赛的获奖者,请多多和大家分享你的经验哈
公告
Claire Zheng · 七月 11, 2022
亲爱的社区开发者们,
我很高兴地向大家介绍一位我们的新版主@黄念刚。
让我们以热烈的掌声欢迎 @黄念刚!
@黄念刚目前任职于东华医为(Mediway),担任技术支持中心开发工程师一职。
以下是@黄念刚的自我简介:
我从2012年入职东华后开始接触InterSystems 的集成平台。使用过 InterSystems早期的Caché版本, Ensemble,目前使用的最高版本是Ensemble2016。
本人有接近10年的医疗信息化经验,熟悉 HL7 V2/V3,有着丰富的领域知识。
InterSystems 平台是一个非常优秀的集成平台,借助该技术,给我们业务带来了非常大的便利。我希望这么优秀的技术,能给更多的兄弟单位和合作伙伴创造价值。我希望能够在社区与大家一起交流,分享自己的一些实践经验,此外希望借助社区这个平台,向大家学习一些优秀的实践。我们一起成长,共同进步!
再次欢迎我们的新版主@黄念刚👏🏼👏🏼👏🏼👏🏼👏🏼
期待你在DC成长为一名优秀版主! 热烈欢迎!!!
公告
Claire Zheng · 十一月 14, 2021
亲爱的开发者们,我们很高兴地跟大家分享一个好消息!
我们的社区全球注册会员突破10000名!中国开发者社区不到一年时间突破270人!增速全球第一!这是一个了不起的成就!感谢大家的支持🎊
在InterSystems,我们相信社区的力量。所以我们非常感谢你们在过去六年里所做的贡献,并期待未来的道路!
我们希望与大家分享一些有趣的数据,全球社区:
2015年12月上线
总计发布 - 8,600篇
共计提问 - 5,500次
总计浏览 - 430万
中文社区
2021年1月上线
总计发布 - 748篇
共计提问 - 100+次
总计浏览 - 21000+
不到一年的时间,能够有如此大的成绩,非常感谢所有人的参与和贡献,感谢你们的热情和分享!我们非常感谢大家的帮助,使我们的社区成为InterSystems乃至整个医疗信息化开发人员更好的地方。大家真的很棒!
请随时分享您成为InterSystems开发人员全球和中国大家庭一员的感受!
再次感谢大家,共同成就了这个可爱的大社区!
敬上,开发者社区团队 ❤️