Nouvelle publication

Rechercher

Article
· Fév 27 7m de lecture

Iris における Flask アプリケーションの実行

Flask_logo

説明

これは、ネイティブウェブアプリケーションとして IRIS にデプロイできる Flask アプリケーションのテンプレートです。

インストール

  1. リポジトリをクローンする
  2. 仮想環境を作成する
  3. 要件をインストールする
  4. docker-compose ファイルを実行する
git clone
cd iris-flask-template
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
docker-compose up

使用法

ベース URL は http://localhost:53795/flask/ です。

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Fév 26

Program read answers from a OS file

Hi,
I want to automate a menu based program for which I don't have the source

If I run it interactively I do this:
do ^<program>

It presents a menu and then you can go down further menus

Based on the selection it may ask for answers to other questions.

Is there some way I give the program a "response" file?

If not would I be able to use I/O redirection for this task?
Inputs would come from a file.
Output should go to the terminal (so I monitor how far the process has gone)

I have seen some examples of redirection code and it seems quite complicated.

IRIS runs on a Linux server

4 Comments
Discussion (4)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Fév 26 2m de lecture

埋め込みSQL &SQL( select xxx into :var from ... ) としたとき、出力ホスト変数varに意図しない値が格納される場合があります

これは InterSystems FAQ サイトの記事です。

埋め込みSQLの出力ホスト変数は、SQLCODE=0(埋め込みSQL正常終了)の場合のみ、正しい値が設定されていることが保証されます。

InterSystems製品のバージョンによっては、SQLCODEが0以外の場合(該当データがない100やエラー等)で値が設定される場合もありますが、その値は無効です。

特に、IRIS2021.1以降のバージョンでは、SQLCODE=100 の場合、INTO 節で指定された出力ホスト変数は NULL("") にクリアされますので注意が必要です。

Cacheや、IRIS2020.x 以前のバージョンでは、明示的な値のクリアを行っておりませんでしたが、こちらについても値は保証されるものではありません。

埋め込みSQLを使用する場合は、必ずSQLCODEを確認してエラーチェックを行うようにして下さい。
また、エラーチェック以外でも、SQLCODE = 0(データあり) の場合と SQLCODE = 100(データなし) の場合は処理を分けるようにし、SQLCODE = 100 の場合は出力ホスト変数を参照しないようご注意ください。


例)
誤った使用例:

  &sql( select name into :name from sample.person where id = 1001 )
  If $Get(name)'="" { // <-- SQLCODE=0以外でnameの値は保証されない
      Write !,"Name = ", name
  } Else {
      Write !,"No such person"
  }



上記の変更例(正しい使用例):

  &sql( select name into :name from sample.person where id = 1001 )
  If SQLCODE=0 {
      Write !,"Name = ", name
  } ElseIf SQLCODE=100 {
      Write !,"No such person"
  } Else {
      Write !,"SQL ERROR: ",SQLCODE
  }


以下ドキュメントをご参照ください。
埋め込みSQLのホスト変数について【IRIS】
埋め込みSQLのホスト変数について


ホスト変数の値には以下のような制限事項があります。

  • 入力ホスト変数は、埋め込み SQL で変更されることはありません。 
  • 出力ホスト変数は、SQLCODE = 0 のときに埋め込み SQL の後でのみ有効性が保証されます。 
Discussion (0)0
Connectez-vous ou inscrivez-vous pour continuer
Annonce
· Fév 26

[Video] Unit Testing with IPM

Hey Community,

Enjoy the new video on InterSystems Developers YouTube:

⏯ Unit Testing with IPM

This is a demo of how to add unit tests to an IRIS application using the InterSystems Package Manager. Covered are how to create new unit tests, the Package Manager commands to run tests, and how to track code coverage statistics using the ObjectScript TestCoverage package.

🗣  Presenter: @Pravin Barton, Principal Applications Developer, InterSystems

Enjoy watching, and look for more videos! 👍

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Fév 26 7m de lecture

La puissance de Python intégré dans l'interopérabilité - un cas d'utilisation de MongoDB CDC

L'utilisation de Embedded Python lors de la création d'une solution basée sur InterSystems peut ajouter des fonctionnalités très puissantes et approfondies à votre boîte à outils.

J'aimerais partager un exemple de cas d'utilisation que j'ai rencontré : l'activation d'un CDC (Change Data Capture) pour une collection mongoDB - la capture de ces modifications, leur digestion via un flux d'interopérabilité et, pour finir, la mise à jour d'un EMR via une API REST.

La fonctionnalité principale – « Observation des changements » 👀

L'idée de base est d'utiliser le package PyMongo, qui, entre autres, permet de suivre les modifications au sein d'une base de données mongo via son change_streams.

La partie importante se trouve dans l'adaptateur entrant que j'ai créé et qui possède une méthode OnInit() qui inclut cette ligne :

self.changeStream = client.get_database(...).get_collection(...).watch()

J'utilise la méthode watch() ici pour surveiller les changements d'une collection spécifique dans une base de données.

Je les ai définis via les paramètres du service métier :

Ensuite, dans la méthode OnTask(), j'utilise ceci pour capturer les modifications :

while self.changeStream.alive:
    change = self.changeStream.try_next()
    if change is not None:

Ici, j'utilise la propriété alive et la méthode try_next() pour obtenir les détails des modifications survenues.

Pour chaque modification, je crée un objet IRIS Stream avec le contenu JSON et je l'envoie à la méthode ProcessInput() du service métier.

Dans le service métier, je crée une requête importée à partir du contenu JSON et je l'envoie au routeur.

Le flux général peut être illustré comme suit :

Voici une démonstration vidéo :

Quelques détails techniques supplémentaires 👩‍💻

Le service métier doit « masser » un peu le JSON car il inclut du JSON « flou », avant que je puisse autoriser son importation en tant que JSON valide.

Par exemple, un message peut ressemble à ceci:

 
Exemple de message JSON de capture de changement 

Vous pouvez voir par exemple que Timestamp et new UUID ne sont pas des JSON valides.

Vous pouvez voir que le « Document » actuel se trouve dans la partie fullDocument, et pour cet exemple j'ai utilisé un schéma spécifique.

Mon document ressemble à ceci :

 
Exemple de document JSON pour cette démo

Dans votre cas, vous pouvez soit modifier cela pour l'adapter à votre schéma, soit même envisager d'adapter mon exemple pour utiliser une approche plus « dynamique » où vous pouvez définir un paramètre qui serait utilisé pour importer dynamiquement le JSON vers un nom de classe variable (par rapport à mon nom codé en dur).

[Dans tous les cas, pour charger votre schéma JSON et créer une classe à partir de celui-ci, vous pouvez utiliser la classe Sample.OpenAPIClassGenerator que j'ai incluse dans mon exemple (adapté du générateur de classe de définition OpenAPI de @Guillaume Rongier (et appeler la méthode ProcessFile() que j'ai ajoutée sur votre fichier de schéma JSON).]

Il s’agit essentiellement de la partie principale de cette fonctionnalité : Adaptateur + Service métier qui envoie des messages avec les modifications apportées à une collection de bases de données Mongo.

Élargir le tableau 👩‍⚕️

À des fins de démonstration et pour créer un flux complet qui « raconte une histoire » (ce qui était le cas d'utilisation réel que j'avais), j'ai également ajouté une cible pour ce CDC, qui est une API REST d'un Dossier Patient Informatisé (DPI ou EMR pour Electronic Medical Record) fictif, qui prend les données des patients et les insère dans une table de patients.

Vous trouverez cette partie sous le package Demo.EMR (Data.Patient pour la table et Util.API pour l'API REST) ; et le package Demo.Int pour la partie Opérations métiers.

En fait, vous pouvez réutiliser cette partie pour tout autre besoin que vous pourriez rencontrer lorsque vous avez besoin d'une API fictive pour envoyer des données de patient à des fins de test en tant que destination cible.

[Notez que la table « Mock EMR » et l'API incluent des éléments de données que je n'ai pas utilisés dans cette démonstration, comme l'adresse e-mail et le numéro de téléphone]

Un exemple de flux complet (avec captures d'écran) 📷

Voici donc un exemple de déroulement de la manière dont cela fonctionne :

1. Ajoutez un document à votre collection mongo.

 
Commandes Shell (Docker exec pour se connecter au conteneur mongo et commandes mongosh pour lancer ReplicaSet et un document vers une collection)

2. Examinez votre table « EMR » et voyez les nouvelles données de Mongo insérées dans celle-ci

 
DBeaver visualisant les données dans la table Patient

3. Examinez les « coulisses » d’InterSystems IRIS en prenant soin de ce flux

 
Trace visuelle du flux de messages

Faites l'essai de votre côté🏎

L'application Open Exchange inclut tout le code associé et les instructions de configuration pour une démonstration complète basée sur le conteneur Docker comme indiqué ci-dessus (avec toutes les parties associées, y compris les conteneurs Mongo).

[Remarque : Mongo a une notion de ReplicaSet et c'est seulement avec cette fonctionnalité que change_streams fonctionne. Pour plus de simplicité, la démonstration ci-dessus suppose que mongo1 (il y a aussi mongo2 et mongo3) est le « principal »].

Encore une fois, ce n’est qu’un exemple de la manière dont Embedded Python peut vous permettre de relever vos défis d’interopérabilité très rapidement et facilement.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer