0 Abonnés · 130 Publications

SQL est un langage standard pour stocker, manipuler et récupérer des données dans des bases de données relationnelles.

Article Iryna Mykhailova · Jan 23, 2024 2m read

Saviez-vous que vous pouvez obtenir des données JSON directement à partir de vos tables SQL ?

Permettez-moi de vous présenter 2 fonctions SQL utiles utilisées pour récupérer des données JSON à partir de requêtes SQL : JSON_ARRAY et JSON_OBJECT.
Vous pouvez utiliser ces fonctions dans l'instruction SELECT avec d'autres types d'éléments de sélection, et elles peuvent être spécifiées à d'autres emplacements où une fonction SQL peut être utilisée, comme dans une clause WHERE.

La fonction JSON_ARRAY prend une liste d'expressions séparées par des virgules et renvoie un array JSON contenant ces valeurs.

0
0 213
Article Pierre LaFay · Jan 21, 2024 4m read

Avec la sortie d'InterSystems IRIS Cloud SQL, nous recevons des questions plus fréquentes sur la manière d'établir des connexions sécurisées via JDBC et d'autres technologies de pilotes.

Bien que nous ayons une belle documentation générale et détaillée sur les technologies de pilote elles-mêmes, notre documentation ne va pas aussi loin pour décrire les outils clients individuels, tels que notre DBeaver préféré.

Dans cet article, nous décrirons les étapes pour créer une connexion sécurisée de DBeaver à votre déploiement Cloud SQL.

0
0 200
InterSystems officiel Benjamin De Boe · Jan 15, 2024

InterSystems a le plaisir d'annoncer la disponibilité générale d'InterSystems IRIS Cloud SQL et d'InterSystems IRIS Cloud IntegratedML, deux services fondamentaux pour le développement de solutions cloud natives optimisées par les performances et la fiabilité éprouvées de classe entreprise de la technologie InterSystems IRIS.

0
0 59
Question Cyril Grosjean · Déc 27, 2023

Bonjour,

Je cherche à pouvoir accéder à mes données contenus dans une RecordMap depuis SQLAlchemy, et même à toute table déjà créée auparavant.

Voici une partie de code :

TestBase:

classTestBase(DeclarativeBase):
    CreatedAt: Mapped[int] = mapped_column(TIMESTAMP, default=func.now())
    UpdatedAt: Mapped[int] = mapped_column(TIMESTAMP, default=func.now(), onupdate=func.current_timestamp())

 

Création de l'engine et binding des entités:

3
0 92
Article Pierre LaFay · Jan 9, 2024 3m read

Bonjour la communauté,

Lors de l'utilisation d'un Business Service de type SQL, il peut arriver que nous ayons besoin de rejouer certaines lignes de la table source.

Prenons comme exemple le Service Métier "from customer SQL" utilisant la classe générique

EnsLib.SQL.Service.GenericService

Différents cas se présentent, selon les paramètres utilisés sur ce Business Service

Premier cas :

Si le Business Service utilise uniquement KeyFieldName

0
0 40
Article Pierre LaFay · Jan 9, 2024 2m read

Salut les développeurs !

Comme vous le savez, InterSystems IRIS, outre les modèles de données globaux, objets, documents et XML, prend également en charge le relationnel où SQL est attendu comme langage pour traiter les données.

Et comme dans d'autres SGBD relationnels, InterSystems, IRIS a son propre dialecte.

Je commence cet article pour prendre en charge une aide-mémoire SQL et vous invite à partager vos favoris. Je mettrai à jour le contenu lors des commentaires entrants.

On y va!

0
1 50
Question Sylvain Guilbaud · Août 23, 2023

Est-il prévu que LOAD DATA prenne en compte plusieurs formats de DATE/DATETIME avec, par exemple un paramètre de indiquant le format utilisé dans les données sources ?

exemple :

LOAD DATA .../...
USING
{
  "from": {
    "file": {
       "dateformat": "DD/MM/YYYY"
    }
  }
}
3
0 88
Article Sylvain Guilbaud · Jan 8, 2024 3m read

Bonjour La Communauté,

en utilisant un Business Service de type SQL, il peut arriver que nous ayons besoin de rejouer certaines lignes de la table source.

Prenons comme exemple le Business Service "from customer SQL"  utilisant la classe générique EnsLib.SQL.Service.GenericService

Différents cas se présentent, en fonction des paramétres utilisés sur ce Business Service.

Premier cas :

Si le Business Service utilise uniquement un champ clé (KeyFieldName)

0
0 51
Question Antoine.Dh · Déc 13, 2023

Bonjour,

Je cherche à faire un systeme de pagination en SQL et je suis tombé sur un article ici https://community.intersystems.com/post/scrollable-resultset-pagination-sample#comment-166186

J'ai essayé d'appliquer la solution, mais j'ai un bug assez particulier et je me demandais si quelqu'un pouvait m'éclairer. Sur mon environnement de dev local aucun soucis, par contre pour la même requete en environnement de preprod j'ai cette erreur:

<UNDEFINED>newvar+3^%qaqcasl *%classname

la requete que j'effectue:

SELECT * FROM (SELECT _DATA.ID, ROW_NUMBER() _RN, COUNT(*) _COUNT FROM XX.srsshiptype _DATA ) WHERE _RN BETWEEN 1 and 1000

La seule piste que j'ai serait peut-etre la une difference au niveau de la version d'IRIS, je suis en 2023.1 conteneur Ubuntu en local, et 2022.1 Windows sur l'environnement de preprod.

Mais comme la solution date de 2021 je me dit qu'elle devrait fonctionner en 2022.1

2
0 93
Article Anna Diak · Nov 30, 2023 3m read

Introduction

À l’ère du numérique en évolution rapide, une communication efficace est cruciale. Cet article présente un projet de chat basé sur Java, combinant la force de la base de données IRIS et l'intelligence artificielle de ChatGPT. Construit sur Java, il va au-delà de la messagerie en temps réel, en tirant parti d'IRIS et de ChatGPT pour une expérience de chat améliorée. De plus, le nom du projet fait référence au classique culturel – Star Wars.

Si vous appréciez mon application, n'oubliez pas de la soutenir lors du concours.

0
0 148
Article Andrii Mishchenko · Nov 28, 2023 2m read

GmOwl est une solution qui offre une plateforme d'apprentissage organisée et engageante. Il a été développé pour répondre au besoin croissant d'outils d'apprentissage offrant un environnement de quiz polyvalent qui répond aux exigences des utilisateurs.

L'objectif principal de GmOwl est d'offrir une expérience utilisateur aux personnes participant à des quiz tout en donnant aux administrateurs un contrôle complet sur le contenu et l'engagement des utilisateurs.

Si vous appréciez mon application, n'oubliez pas de la soutenir lors du concours.

0
0 65
Article Niels Genne · Nov 24, 2023 4m read

Comment déployer les productions IRIS sereinement et plus rapidement ?

L'objectif des productions d'interopérabilité est de vous permettre de connecter des systèmes afin de transformer et d'acheminer des messages entre eux. Pour connecter des systèmes, vous développez, configurez, déployez et gérez des productions qui intègrent plusieurs solutions.

C’est ce que nous dit la documentation InterSystems sur son site de référence, mais que faut-il réellement faire pour déployer une production ?

On peut composer les productions, selon les usages, pour connecter des systèmes externes à IRIS Data Platform. Il est pour cela nécessaire de créer un environnement propre à chaque production à savoir les composants suivants :

  • un Business service 📨
  • un Business processus (facultatif) 📘
  • une Business opération 💉
  • des schémas de définition de table (.cls; classes) 📅
  • un fichier d’initialisation d’espace de noms (.cpf) 📋

Bien sûr l’importance d’employer les productions pour traiter les messages réside dans le fait de pouvoir tracer chaque message et remonter ainsi la trace des accidents de parcours de chaque événement indésirable.

Et si je vous disais qu’il est possible de déployer vos productions à l’aide de notre framework d’interopérabilité IRIS d’un coup de baguette magique ?🪄

Explications

L’approche mainframe de laquelle provient notre framework permet de déployer à vitesse grand « V » des productions IRIS InterSystems® sans devoir recréer tous les composants à la main.

L’emploi du framework permet d’ajouter une fonctionnalité intéressante autorisant la lecture des données des tables à déployer avec la production : l’ajout d’une API sortante (RestForms2).

Sounds good :)

➡️Les données deviennent ainsi interrogeables et restituables dans un format JSON.

Le framework va générer tous les composants en se basant sur un fichier de spécifications fonctionnelles rempli en accord avec le métier et notre chef de projet (dont le rôle est de veiller à ce que chaque information nécessaire trouve sa place).

Le script agit en deux temps à savoir : la construction du flux ETL et du point de chute des données. 📦🪂

Une fois rempli conformément à ce qui est attendu, le fichier de spécifications fonctionnelles permet de générer dans un premier temps : le fichier de sérialisation des messages (classes de données ; obj.py), le fichier de structure des données dans chaque message (msg.py), le fichier de génération de messages (bs.py) et le fichier d’ingestion des messages dans la base de données correspondante (bo.py); dans un second temps : il sert à créer/supprimer les tables dans la base de données sous forme d’un script SQL comprenant des instructions DDL (Data Definition Language).

De quoi vous faire gagner beaucoup de temps ! ⌚ Le plus beau dans tout cela, c’est que le framework est déployable facilement depuis un container Docker ! 🐳

Intérêts

Toujours pas convaincu(e) ? En quoi utiliser ce framework vous ferait gagner 80% du temps ?⏱️

Et si je vous disais que le code déployé par le framework est validé par l’éditeur InterSystems®, qu’il permet à votre équipe de travailler sur du code uniformisé, que lors de campagnes de maintenance cette possibilité vous incite à être plus efficace en cas de mise à jour de code ou de recherche de bug, qu’il vous permet d’interagir avec vos données à l’aide d’un mécanisme de REST API (issu du dépôt des paquets compatibles InterSystems IRIS toutes versions confondues). Cela fait sens pour vous ? 👌

Qu’entend-on par « le code est validé par l’éditeur » ? ✅ Simplement qu’il respecte les standards Python et ceux de l’éditeur en matière d’architecture, d’appels aux mécanismes internes d’IRIS InterSystems® également qu’il sait s’interfacer avec le langage ObjectScript et vice versa.

La suite

Si cet article fait écho à vos besoins ou si vous êtes simplement curieux de voir comment ce framework pourrait révolutionner votre manière de travailler sous IRIS InterSystems® : rendez vous sur notre site web et/ou demander un accès à notre Discord Server pour discuter avec l’un de nos experts.

Suivez-nous aussi sur LinkedIn profile

Prochainement, nous vous ferons découvrir un cas d’usage du framework en environnement opérationnel 😉 !

0
0 105
Article Guillaume Rongier · Oct 16, 2023 8m read

Aujourd'hui, il y a beaucoup de bruit autour du LLM, de l'IA, etc. Les bases de données vectorielles en font partie, et il existe déjà de nombreuses réalisations différentes pour le support en dehors d'IRIS. 

Pourquoi Vector?

  • Recherche de similarité : Les vecteurs assurent une recherche de similarité efficace, par exemple en trouvant les éléments ou les documents les plus similaires dans un ensemble de données. Les bases de données relationnelles classiques sont conçues pour des recherches de correspondances exactes, qui ne sont pas adaptées à des tâches telles que la recherche de similitudes d'images ou de textes.
  • Flexibilité : Les représentations vectorielles sont polyvalentes et peuvent être obtenues à partir de différents types de données, tels que du texte (via des embeddings comme Word2Vec, BERT), des images (via des modèles d'apprentissage profond), et autres.
    • Recherches multimodales** : Les vecteurs permettent d'effectuer des recherches dans différentes modalités de données. Par exemple, avec une représentation vectorielle d'une image, on peut rechercher des images similaires ou des textes connexes dans une base de données multimodale.

Et pour bien d'autres raisons encore.

Donc, pour ce concours python, j'ai décidé de mettre en place ce support. Et malheureusement, je n'ai pas réussi à le terminer à temps, je vais vous expliquer pourquoi.

Il y a un certain nombre de choses importantes à faire pour qu'il soit complet

  • Accepter et stocker des données vectorisées, avec SQL, exemple simple, (3 dans cet exemple est le nombre de dimensions, il est fixé par champ, et tous les vecteurs dans le champ doivent avoir des dimensions exactes)
createtable items(embedding vector(3));
insertinto items (embedding) values ('[1,2,3]');
insertinto items (embedding) values ('[4,5,6]');
  • Fonctions de similarité, il existe des algorithmes de similarité différents, adaptés à une recherche simple sur une petite quantité de données, sans utiliser d'index
    -- Euclidean distanceselect embedding, vector.l2_distance(embedding, '[9,8,7]') distance from items orderby distance;
    -- Cosine similarityselect embedding, vector.cosine_distance(embedding, '[9,8,7]') distance from items orderby distance;
    -- Inner productselect embedding, -vector.inner_product(embedding, '[9,8,7]') distance from items orderby distance;
  • * Index personnalisé, pour accélérer la recherche sur une grande quantité de données. Les index peuvent utiliser un algorithme différent et des fonctions de distance différentes de celles mentionnées ci-dessus, ainsi que d'autres options. * HNSW![](https://miro.medium.com/v2/resize:fit:1400/1*ziU6_KIDqfmaDXKA1cMa8w.png) * Index de fichier inversé ![](/sites/default/files/inline/images/images/image(7029).png) * La recherche n'utilisera que l'index créé et son algorithme trouvera l'information demandée.

    Insertion de vecteurs

    On suppose que le vecteur est un tableau de valeurs numériques, lesquelles peuvent être des entiers ou des flottants, ainsi que signées ou non. Dans IRIS, nous pouvons le stocker comme $listbuild, il a une bonne représentation, il est déjà supporté, il faut seulement implémenter la conversion d'ODBC en logique.

    Les valeurs peuvent ensuite être insérées sous forme de texte brut à l'aide de pilotes externes tels que ODBC/JDBC ou à partir d'IRIS avec ObjectScript.

  • SQL
    insertinto items (embedding) values ('[1,2,3]');
  • à partir ObjectScript
    set rs = ##class(%SQL.Statement).%ExecDirect(, "insert into test.items (embedding) values ('[1,2,3]')")
    

    set rs = ##class(%SQL.Statement).%ExecDirect(, "insert into test.items (embedding) values (?)", $listbuild(2,3,4))

  • Ou Embedded SQL
    &sql(insertinto test.items (embedding) values ('[1,2,3]'))
    

    set val = $listbuild(2,3,4) &sql(insertinto test.items (embedding) values (:val))

  • Il sera toujours stocké sous la forme de $lb(), et renvoyé au format textuel dans ODBC.

     
    Comportement imprévu
    Au cours des tests effectués avec DBeaver, j'ai constaté que la première ligne après la connexion était insérée correctement, mais que toutes les autres étaient insérées telles quelles, sans aucune validation ou conversion. 
    <p>
      J'ai ensuite découvert que JDBC utilise les insertions rapide <a href="https://docs.intersystems.com/iris20211/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_insert#RSQL_insert_fast">Fast Inserts</a> par défaut, dans ce cas, les données insérées sont stockées directement dans les globales, et j'ai donc dû les désactiver manuellement
    </p>
    
    <p>
      Dans DBeaver, sélectionnez optfastSelect dans le champ FeatureOption.
    </p>
    
    <p>
      <img src="/sites/default/files/inline/images/images/image(7036).png" />
    </p>
    

    Calculations

    Les vecteurs sont principalement nécessaires pour calculer les distances entre deux vecteurs.

    Pour le concours, j'ai eu besoin d'utiliser l'outil Embedded Python, et c'est là que se pose le problème de savoir comment utiliser $lb dans Embedded Python. Il y a une méthode ToList dans %SYS.Class, mais le paquetage d'iris de Python ne l'a pas intégrée, et il faut l'appeler comme ObjectScript.

    ClassMethod l2DistancePy(v1 As dc.vector.type, v2 As dc.vector.type) As%Decimal(SCALE=10) [ Language = python, SqlName = l2_distance_py, SqlProc ]
    {
        import iris 
        import math
        
        vector_type = iris.cls('dc.vector.type')
        v1 = iris.cls('%SYS.Python').ToList(vector_type.Normalize(v1))
        v2 = iris.cls('%SYS.Python').ToList(vector_type.Normalize(v2))
    
        return math.sqrt(sum([(val1 - val2) ** 2for val1, val2 in zip(v1, v2)]))
    }
    

    Cela ne semble pas correct du tout. Je préférerais que $lb puisse être interprété directement comme une liste en python, ou comme les fonctions intégrées to_list et from_list.

    Un autre problème s'est posé lorsque j'ai essayé de tester cette fonction de différentes manières. En utilisant SQL à partir d'Embedded Python qui emploie la fonction SQL écrite dans Embedded Python, elle se plante. J'ai donc dû ajouter les fonctions ObjectScript.

    ModuleNotFoundError: No module named 'dc'
    SQL Function VECTOR.NORM_PY failed with error:  SQLCODE=-400,%msg=ERROR #5002: ObjectScript error:
    
    
      %0AmBm3l0tudf^%sqlcq.USER.cls37.1 *python object not found

    Les fonctions sont actuellement implémentées pour calculer la distance, à la fois en Python et en ObjectScript

    • Distance euclidienne
      [SQL]_system@localhost:USER> select embedding, vector.l2_distance_py(embedding, '[9,8,7]') distance from items orderby distance;
      +-----------+----------------------+
      | embedding | distance             |
      +-----------+----------------------+
      | [4,5,6]   | 5.91607978309961613  |
      | [1,2,3]   | 10.77032961426900748 |
      +-----------+----------------------+
      2 rows in setTime: 0.011s
      [SQL]_system@localhost:USER> select embedding, vector.l2_distance(embedding, '[9,8,7]') distance from items orderby distance;
      +-----------+----------------------+
      | embedding | distance             |
      +-----------+----------------------+
      | [4,5,6]   | 5.916079783099616045 |
      | [1,2,3]   | 10.77032961426900807 |
      +-----------+----------------------+
      2 rows in setTime: 0.012s
    • Similarité cosinus
      [SQL]_system@localhost:USER> select embedding, vector.cosine_distance(embedding, '[9,8,7]') distance from items orderby distance;
      +-----------+---------------------+
      | embedding | distance            |
      +-----------+---------------------+
      | [4,5,6]   | .034536677566264152 |
      | [1,2,3]   | .11734101007866331  |
      +-----------+---------------------+
      2 rows in setTime: 0.034s
      [SQL]_system@localhost:USER> select embedding, vector.cosine_distance_py(embedding, '[9,8,7]') distance from items orderby distance;
      +-----------+-----------------------+
      | embedding | distance              |
      +-----------+-----------------------+
      | [4,5,6]   | .03453667756626421781 |
      | [1,2,3]   | .1173410100786632659  |
      +-----------+-----------------------+
      2 rows in setTime: 0.025s
    <li>
      Produit scalaire
      <pre class="codeblock-container" idlang="1" lang="SQL" tabsize="4"><code class="language-sql hljs">[SQL]_system@localhost:USER> <span class="hljs-keyword">select</span> embedding, vector.inner_product_py(embedding, <span class="hljs-string">'[9,8,7]'</span>) distance <span class="hljs-keyword">from</span> items <span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> distance;
    

    +-----------+----------+ | embedding | distance | +-----------+----------+ | [1,2,3] | 46 | | [4,5,6] | 118 | +-----------+----------+ 2 rows in setTime: 0.035s [SQL]_system@localhost:USER> select embedding, vector.inner_product(embedding, '[9,8,7]') distance from items orderby distance; +-----------+----------+ | embedding | distance | +-----------+----------+ | [1,2,3] | 46 | | [4,5,6] | 118 | +-----------+----------+ 2 rows in setTime: 0.032s

    En outre, les fonctions mathématiques suivantes ont été intégrées : add (ajouter), sub (sous), div (diviser), mul (multiplier). InterSystems permet de créer ses propres fonctions d'agrégation. Ainsi, il serait possible de faire la somme totale de tous les vecteurs ou de trouver la moyenne. Malheureusement, InterSystems ne permet pas d'utiliser le même nom et nécessite l'utilisation d'un nom (et d'un schéma) propre pour la fonction. Mais il ne prend pas en charge les résultats non numériques pour les fonctions d'agrégation.

    La fonction vector_add simple, qui renvoie la somme de deux vecteurs

    Lorsqu'elle est utilisée en tant qu'agrégat, la valeur est de 0, alors que le vecteur attendu est également de 0.

    Création d'un index

    Malheureusement, je n'ai pas réussi à terminer cette partie, en raison de certains obstacles que j'ai rencontrés lors de la réalisation. 

    • L'absence de $lb intégré à des conversions de listes python et inversement lorsque le vecteur dans IRIS est stocké dans $lb, et que toute la logique de construction de l'index est censée être en Python, il est important également de récupérer les données de $lb et de les réintégrer dans les globales.
    <li>
      absence de support pour les globales
      <ul>
        <li>
          Dans IRIS, $Order supporte la direction, cette fonction peut donc être utilisée en sens inverse, alors que la réalisation de l'ordre dans Python Embedded ne la supporte pas, il faudra donc lire toutes les clés et les inverser ou stocker la fin quelque part.
        </li>
    
      </ul>
    </li>
    
    
    <li>
      J'ai des doutes suite à une mauvaise expérience avec les fonctions SQL de Python, appelées à partir de Python mentionné ci-dessus.
    </li>
    
    
    <li>
      Au cours de la construction de l'index, il était prévu de stocker les distances dans le graphe entre les vecteurs, mais un bogue s'est produit lors du stockage de nombres flottants dans les données globales de l'index.
    </li>
    

    J'ai abordé 11 problèmes avec Embedded Python que j'ai trouvés pendant le travail, donc la plupart du temps il faut trouver des solutions de contournement pour résoudre les problèmes. Avec l'aide du projet de @Guillaume Rongier nommé iris-dollar-list j'ai réussi à résoudre certains problèmes.

    Installation

    Quoi qu'il en soit, ce logiciel est toujours disponible et peut être installé avec IPM, et utilisé même avec des fonctionnalités limitées. 

    zpm "install vector"

    Ou en mode de développement avec docker-compose

    git clone https://github.com/caretdev/iris-vector.git
    cd iris-vector
    docker-compose up -d
    0
    0 107
    Article Lorenzo Scalese · Oct 4, 2023 8m read

    Description du cas

    Imaginons que vous soyez un développeur en Python ou que vous disposiez d'une équipe bien formée et spécialisée en Python, mais que le délai qui vous est imparti pour analyser certaines données dans IRIS soit serré. Bien sûr, InterSystems offre de nombreux outils pour toutes sortes d'analyses et de traitements. Cependant, dans le scénario donné, il est préférable de faire le travail en utilisant le bon vieux Pandas et de laisser IRIS pour une autre fois.
        Dans la situation décrite ci-dessus et dans bien d'autres cas, il se peut que vous souhaitiez extraire des tables d'IRIS pour gérer des données en dehors des produits d'InterSystems. Cependant, vous pouvez également avoir besoin de faire les choses dans l'autre sens lorsque vous avez un tableau externe dans n'importe quel format, à savoir CSV, TXT ou Pickle, que vous avez besoin d'importer et d'utiliser les outils d'IRIS sur celui-ci.
    Indépendamment du fait que vous ayez ou non à faire face à un problème décrit ci-dessus, Innovatium m'a appris qu'il est toujours utile de connaître plusieurs façons de résoudre un problème de codage. La bonne nouvelle, c'est qu'il n'est pas nécessaire de passer par le processus laborieux de création d'un nouveau tableau, de transfert de toutes les lignes et d'ajustement de chaque type lorsque l'on importe un tableau d'IRIS.
        Cet article vous montrera comment transformer rapidement un tableau IRIS en une trame de données Pandas et inversement avec seulement quelques lignes de code. Vous pouvez consulter le code à partir de mon GitHub, où vous trouverez Jupiter Notebook avec toutes les étapes de ce tutoriel.

    Importation du tableau d'IRIS

    Bien entendu, vous devez commencer par importer les bibliothèques nécessaires à ce projet.

    import pandas as pd
    import sqlalchemy as db

    L'étape suivante consiste à créer la connexion entre le fichier Python et l'instance IRIS. Pour ce faire, nous utiliserons la fonction create_engine() de SQLAlchemy, avec une chaîne en tant que paramètre. Cette chaîne doit contenir des informations sur le dialecte de l'opération, le nom d'utilisateur et le mot de passe, l'hôte et le port de l'instance, ainsi que l'espace de noms de destination. Pour plus d'informations sur les concepts de base de l'utilisation de sqlalchemy-iris, consultez l'un de mes articles précédents, SQLAlchemy - la façon la plus simple d'utiliser Python et SQL avec les bases de données d'IRIS.

    engine = db.create_engine("iris://_system:SYS@localhost:1972/SAMPLE")
    connection = engine.connect()

    Ensuite, nous pouvons déclarer une variable qui contiendra la trame de données et appeler la fonction read_sql_table() de Pandas sur cette connexion, en spécifiant le nom du tableau sous la forme d'une chaîne avec le schéma. Vous pouvez également indiquer le schéma dans un autre argument, ce qui est, en fait, préférable car le fait d'avoir un point sur la chaîne de nom peut provoquer des erreurs dans certains cas.

    df = pd.read_sql_table("NameAge", connection, schema="PD")

    C'est une bonne pratique de vérifier si le tableau avec lequel nous travaillons existe dans le schéma que nous voulons utiliser et, bien sûr, s'il y a un schéma dont nous avons besoin au départ. Dans la dernière section de cet article, vous apprendrez comment le faire ainsi que quelques autres conseils. À partir de maintenant, si vous avez l'habitude d'utiliser Pandas, vous pouvez effectuer toutes les modifications et analyses que vous souhaitez puisque vous savez quoi faire. Explorez l'exemple suivant pour voir comment cela fonctionne.

    Envoi d'un tableau à IRIS

    Avant de commencer, modifions un peu notre trame de données, à titre d'exemple. Nous pouvons adapter les valeurs d'une colonne à nos besoins (par exemple, ajouter des lignes et des colonnes, etc.). Après avoir joué un peu, j'ai mis les noms en minuscules et j'ai ajouté une nouvelle personne et une colonne sur la base des données existantes. Vous pouvez consulter l'illustration suivante pour voir le résultat.

    Nous pouvons maintenant le renvoyer à IRIS par une seule ligne de code. Il suffit de spécifier le moteur et le nom du tableau.

    df.to_sql("NameAge", con=engine, schema="PD", if_exists="replace")

    Une fois de plus, nous devons placer le schéma dans un argument séparément du nom du tableau afin d'éviter certaines erreurs et un comportement indésirable. En outre, l'argument if_exists spécifie ce qu'il faut faire s'il existe déjà un tableau portant le même nom dans le schéma concerné. Les valeurs possibles sont : "replace" (remplacer), "fail" (échouer, la valeur par défaut) et "append" (ajouter). Bien entendu, l'option "replace" supprime le tableau et en crée un nouveau à l'aide d'une commande SQL, tandis que l'option "append" ajoute les données au tableau existant. N'oubliez pas que cette méthode ne vérifie pas les valeurs répétées ; soyez donc prudent lorsque vous utilisez cet attribut. Enfin, la valeur "fail" provoque l'erreur suivante :

    Gardez à l'esprit que si vous spécifiez un nom de tableau qui n'existe pas, la fonction le créera.

    Vous pouvez maintenant lancer une requête dans IRIS pour voir ce qu'il y a de nouveau ou aller dans le Portail de gestion dans la partie consacrée à SQL. N'oubliez pas que si vous avez utilisé la valeur "replace", vous devez consulter le code source de la classe, car la méthode la réécrit complètement. Cela signifie que si vous avez implémenté des méthodes, vous devez les laisser dans une superclasse.

    Plus d'astuces sur sqlalchemy-iris

    Si vous rencontrez quelques problèmes que vous n'avez pas pu résoudre avec les informations partagées dans d'autres communautés ou forums liés au code de votre application, vous trouverez peut-être ici l'aide dont vous avez besoin. Vous y découvrirez une liste d'astuces pour trouver des détails sur le moteur et le dialecte.

    Caractéristiques spécifiques au dialecte

    SQL Alchemy travaille avec des dialectes qui sont automatiquement choisis en fonction de votre moteur. Lorsque vous utilisez la fonction create_engine() pour vous connecter à une base de données IRIS, le dialecte choisi est sqlalchemy-iris by Dmitry Maslennikov.
    Vous pouvez accéder à ses caractéristiques et les modifier à l'aide de la propriété de dialecte de votre moteur.

    engine = db.create_engine("iris://_system:SYS@localhost:1972/SAMPLE")
    engine.dialect

    Avec l'extension IntelliCode de VSCode, vous pouvez rechercher toutes les options de cette propriété ou consulter le code source sur CaretDev's GitHub.

    Vérification des schémas disponibles dans un moteur

    Une fonction spéciale du dialecte digne d'être soulignée est la fonction get_schema_names(). Faites attention ! Les informations suivantes peuvent être cruciales pour vous si vous voulez éviter les erreurs dans votre code et pour l'itération.

    connection = engine.connect()
    engine.dialect.get_schema_names(connection)

     

    Vérification des tableaux disponibles dans un schéma

    Examinons une situation semblable. Il se peut que vous ayez besoin de connaître les tableaux disponibles à partir d'un schéma. Dans ce cas, vous pouvez utiliser l'inspection. Exécutez la fonction inspect() sur le moteur et enregistrez-la dans une variable. Cette même variable sera utilisée pour accéder à une autre fonction, get_table_names(). Elle renverra une liste des noms de tableaux dans le schéma spécifié ou dans la valeur par défaut "SQLUser".

    inspection = db.inspect(engine)
    inspection.get_table_names(schema="Sample")
    

    De plus, si vous souhaitez utiliser plus de fonctionnalités de SQL Alchemy sur vos données, vous pouvez déclarer une base et faire en sorte que ses métadonnées reflètent un schéma du moteur.

    b = db.orm.declarative_base()
    b.metadata.reflect(engine, schema="Sample")

    Si vous avez besoin de plus d'informations pour résoudre ce problème, consultez la Documentation SQL Alchemy et le dépôt sqlalchemy-iris GitHub Repository. Vous pouvez également m'envoyer un message ou laisser un commentaire, et nous essaierons de découvrir le secret ensemble.

    Considérations finales

    L'approche de mise en œuvre présentée dans cet article met l'accent sur l'utilisation des instances IRIS en tant que fournisseurs de services en nuage et permet d'effectuer une analyse sur différentes bases. Elle facilite la surveillance simultanée de toutes les instances dans toutes leurs qualités et la comparaison de leurs performances et de leur utilisation. Si vous combinez ces connaissances avec le développement décrit dans un autre article à propos d'un portail réalisé avec Django, vous pouvez rapidement construire un gestionnaire puissant pour autant de fonctionnalités et d'instances que vous le souhaitez.
        Cette implémentation est également un moyen efficace de transférer des données de l'extérieur d'IRIS vers une classe bien construite. Comme vous êtes peut-être familier avec d'autres fonctions trouvées dans Pandas pour traiter de nombreux langages différents, à savoir CSV, JSON, HTML, Excel et Pickle, il vous sera facile de changer read_sql\table en read_csv, read_json, ou toute autre option. Certes, je dois vous avertir que l'intégration avec InterSystems à partir de certains types de données n'est pas une fonctionnalité intégrée et qu'elle n'est donc pas toujours facile à mettre en œuvre. Cependant, l'union de SQL Alchemy et de Pandas sera toujours utile pour exporter des données depuis IRIS.
        Ainsi, dans cet article, nous avons appris qu'IRIS possède tous les outils dont vous avez besoin pour vous aider à développer et à intégrer facilement les dispositifs existants de votre système ou les dispositifs de votre domaine d'expertise.
     

    0
    0 146
    Article Sylvain Guilbaud · Oct 2, 2023 13m read

    Pour le prochain Concours Python, j'aimerais faire une petite démo, sur la création d'une simple application REST en Python, qui utilisera IRIS comme base de données. Et utiliser les outils suivants

    • Le cadre FastAPI, très performant, facile à apprendre, rapide à coder, prêt pour la production.
    • SQLAlchemy est la boîte à outils SQL et le Mapping objet-relationnel de Python qui donne aux développeurs en Python toute la puissance et la flexibilité de SQL.
    • Alembic est un outil léger de migration de base de données à utiliser avec le SQLAlchemy Database Toolkit pour Python.
    • Uvicorn est une implémentation de serveur web ASGI pour Python.

    Préparation de l'environnement

    En supposant que Python soit déjà installé, au moins en version 3.7., il faut créer un dossier de projet, et y créer un fichier requirements.txt avec le contenu suivant

    fastapi==0.101.1
    alembic==1.11.1
    uvicorn==0.22.0
    sqlalchemy==2.0.20
    sqlalchemy-iris==0.10.5

     Je vous conseille d'utiliser l'environnement virtuel en python, nous allons créer un nouvel environnement et l'activer.

    python -m venv env && source env/bin/activate

    Et maintenant, nous pouvons installer nos dépendances

    pip install -r requirements.txt

    Démarrage rapide

    Créons l'Api REST la plus simple avec FastAPI. Pour ce faire, créons app/main.py

    from fastapi import FastAPI
    
    app = FastAPI(
        title='TODO Application',
        version='1.0.0',
    )
    
    @app.get("/ping")asyncdefpong():return {"ping": "pong!"}
    

    Pour l'instant, il suffit de démarrer notre application, et elle devrait déjà fonctionner. Pour démarrer le serveur, nous allons utiliser uvicorn

    $ uvicorn app.main:app         
    INFO:     Processus de serveur lancé [94936]
    INFO:     En attente du lancement de l'application.
    INFO:     Application startup compléte.
    INFO:     Uvicorn fonctionne sur http://127.0.0.1:8000 ( Appuyez sur CTRL+C pour quitter)

    Et nous pouvons soumettre une requête de ping.

    $ curl http://localhost:8000/ping
    {"ping":"pong!"}

    FastAPI propose une interface utilisateur permettant de tester l'API.

    Environnement Dockerisé

    Pour ajouter IRIS à notre application, nous allons utiliser des conteneurs. L'image d'IRIS sera utilisée telle quelle, mais il nous faut construire une image Docker pour l'application python. Et nous aurons besoin de Dockerfile

    FROM python:3.11-slim-buster
    
    WORKDIR /usr/src/app
    RUN --mount=type=bind,src=.,dst=. \
        pip install --upgrade pip && \
        pip install -r requirements.txt
    COPY . .
    ENTRYPOINT [ "/usr/src/app/entrypoint.sh" ]
    

    Pour lancer l'application à l'intérieur du conteneur, il faut un simple entrypoint.sh.

    #!/bin/sh
    # Exécution des migrations SQL, pour mettre à jour le schéma de la base de données
    alembic upgrade head
    
    # Lancement de l'application Python
    uvicorn app.main:app \
          --workers 1 \
          --host 0.0.0.0 \
          --port 8000 "$@"

    N'oubliez pas d'ajouter un drapeau d'exécution

    chmod +x entrypoint.sh

    Et combinez avec IRIS dans docker-compose.yml

    version:"3"services:  iris:    image:intersystemsdc/iris-community    ports:      -1972    environment:      -IRISUSERNAME=demo      -IRISPASSWORD=demo    healthcheck:      test:/irisHealth.sh      interval:5s  app:    build:.    ports:      -8000:8000    environment:      -DATABASE_URL=iris://demo:demo@iris:1972/USER    volumes:      -./:/usr/src/app    depends_on:      iris:        condition:service_healthy    command:      ---reload

    Construisons-le

    docker-compose build

    Le premier modèle de données

    Maintenant, déclarons l'accès à notre base de données IRIS à l'application, en ajoutant le fichier app/db.py, qui configurera SQLAlchemy pour accéder à notre base de données définie à travers l'URL passée par docker-compose.yml. Ce fichier contient également quelques gestionnaires que nous utiliserons plus tard dans l'application.

    import os
    
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base
    from sqlalchemy.orm import sessionmaker
    
    DATABASE_URL = os.environ.get("DATABASE_URL")
    ifnot DATABASE_URL:
        DATABASE_URL = "iris://demo:demo@localhost:1972/USER"
    engine = create_engine(DATABASE_URL, echo=True, future=True)
    
    Base: DeclarativeMeta = declarative_base()
    
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    
    
    definit_db():
        engine.connect()
    
    
    defget_session():
        session = SessionLocal()
        yield session
    

    Et nous sommes prêts à définir le premier et unique modèle de notre application. Nous créons et éditons le fichier app/models.py, il utilisera SQLAlchemy pour définir le modèle, nommé Todo, à trois colonnes, id, title, et description.

    from sqlalchemy import Column, Integer, String, Text
    from app.db import Base
    
    
    classTodo(Base):
        __tablename__ = 'todo'
        id = Column(Integer, primary_key=True, index=True)
        title = Column(String(200), index=True, nullable=False)
        description = Column(Text, nullable=False)
    

    Préparation de la migration SQL

    Dans ce monde changeant, nous savons que notre application sera améliorée à l'avenir, que la structure de nos tableaux n'est pas définitive, que nous pouvons ajouter des tableaux, des colonnes, des index, etc. Dans ce cas, le meilleur scénario consiste à utiliser des outils de migration SQL, qui permettent de mettre à jour la structure actuelle de la base de données en fonction de la version de notre application, et grâce à ces outils, il est également possible de la rétrograder, au cas où quelque chose ne fonctionnerait pas. Bien que dans ce projet nous utilisions Python et SQLAlchemy, l'auteur de SQLAlchemy propose son outil nommé Alembic, et nous allons l'utiliser ici.

    We need to start IRIS and container with our application, at this moment we need bash, to be able to run commands

    $ docker-compose run --entrypoint bash app
    [+] Creating 2/0
     ✔ Réseau  fastapi-iris-demo_default   Crée                                                                                                                                                        0.0s 
     ✔ Conteneur fastapi-iris-demo-iris-1  Crée                                                                                                                                                        0.0s 
    [+] Exécution 1/1
     ✔ Conteneur fastapi-iris-demo-iris-1  Lancé                                                                                                                                                        0.1s 
    root@7bf903cd2721:/usr/src/app# 

    Exécution de la commande alembic init app/migrations

    root@7bf903cd2721:/usr/src/app# alembic init app/migrations
      Création du répertoire '/usr/src/app/app/migrations' ...  exécuté
      Création du répertoire '/usr/src/app/app/migrations/versions' ...  exécuté
      Génération de /usr/src/app/app/migrations/README ...  exécuté
      Génération de /usr/src/app/app/migrations/script.py.mako ...  exécuté
      Génération de /usr/src/app/app/migrations/env.py ...  exécuté
      Génération de /usr/src/app/alembic.ini ...  exécuté
      Veuillez modifier les paramètres de configuration/connexion/logging dans '/usr/src/app/alembic.ini' avant de continuer.
    root@7bf903cd2721:/usr/src/app#

    Cette configuration alembic a été préalablement configurée, et nous devons la corriger pour qu'elle corresponde aux besoins de notre application. Pour ce faire, il faut éditer le fichier app/migrations/env.py. Ce n'est que le début du fichier, qui doit être mis à jour, en se concentrant sur la mise à jour de sqlalchemy.url et target_metadata. Ce qui se trouve en dessous reste inchangé

    import os
    import urllib.parse
    from logging.config import fileConfig
    
    from sqlalchemy import engine_from_config
    from sqlalchemy import pool
    
    from alembic import context
    
    # il s'agit de l'objet Alembic Config, qui permet# d'accéder aux valeurs du fichier .ini utilisé.
    config = context.config
    
    DATABASE_URL = os.environ.get("DATABASE_URL")
    
    decoded_uri = urllib.parse.unquote(DATABASE_URL)
    config.set_main_option("sqlalchemy.url", decoded_uri)
    
    # Interprétation du fichier de configuration pour l'enregistrement Python.# Cette ligne met en place les enregistreurs de façon basique.if config.config_file_name isnotNone:
        fileConfig(config.config_file_name)
    
    # ajoutez ici l'objet MetaData de votre modèle# pour la prise en charge de l'autogénérationfrom app.models import Base
    target_metadata = Base.metadata
    # target_metadata = non applicable

    Nous avons déjà un modèle, maintenant il faut créer une migration, avec la commande alembic revision --autogenerate (alembic revision ---autogénérer).

    root@7bf903cd2721:/usr/src/app# alembic revision --autogenerate
    INFO  [alembic.runtime.migration] Contexte impl IRISImpl.
    INFO  [alembic.runtime.migration] Cela suppose un DDL non transactionnel.
    INFO  [alembic.autogenerate.compare] Détection du tableau "todo" ajouté
    INFO  [alembic.autogenerate.compare] Détection d'un index ajouté 'ix_todo_id' sur '['id']'
    INFO  [alembic.autogenerate.compare] Détection d'un index ajouté 'ix_todo_title' sur '['title']'
      Generating /usr/src/app/app/migrations/versions/1e4d3b4d51ca_.py ... exécuté
    root@7bf903cd2721:/usr/src/app# 
     
    Let's see generated migration

    Maintenant il faut appliquer ceci à la base de données, avec la commande alembic upgrade head, où "head" est un mot-clé pour mettre à jour vers la dernière version.

    root@7bf903cd2721:/usr/src/app# alembic upgrade head
    INFO  [alembic.runtime.migration] Contexte impl IRISImpl.
    INFO  [alembic.runtime.migration] Cela suppose un DDL non transactionnel.
    INFO  [alembic.runtime.migration] Exécution de la mise à jour -> 1e4d3b4d51ca, message vide
     
    Rétrogradation
    Si, au cours de la mise à jour de l'application, nous découvrons que nous devons revenir en arrière, nous pouvons rétrograder la base de données, par exemple la dernière révision sera head-1.
    <pre>root@7bf903cd2721:/usr/src/app# alembic downgrade head-1
    

    INFO  [alembic.runtime.migration] Contexte impl IRISImpl. INFO  [alembic.runtime.migration] Cela suppose un DDL non transactionnel. INFO  [alembic.runtime.migration] Exécution de la rétrogradation 1e4d3b4d51ca -> , message vide

    <p>
      et pour rétrograder complètement vers un état vide, utilisez le mot-clé <strong>base</strong>
    </p>
    

    Vérifiez l'état actuel à tout moment, ce qui vous donnera des informations sur les migrations manquantes.

    root@7bf903cd2721:/usr/src/app# alembic check
    INFO  [alembic.runtime.migration] Contexte impl IRISImpl.
    INFO  [alembic.runtime.migration] Cela suppose un DDL non transactionnel.
    Aucune nouvelle opération de mise à jour détectée.

    Accessibilité des données

    Donc, nous pouvons maintenant retourner au REST, et il nous faut le faire fonctionner, quitter le conteneur actuel et lancer le service d'application comme d'habitude maintenant, uvicorn a un drapeau --reload, donc, il vérifiera les changements dans les fichiers python et redémarrera lorsque nous les changerons.

    $ docker-compose up app
    [+] Running 2/0
     ✔ Conteneur fastapi-iris-demo-iris-1 Lancé                                                                                                                                                        0.0s 
     ✔ Conteneur fastapi-iris-demo-app-1   Crée                                                                                                                                                       0.0s 
    Attaching to fastapi-iris-demo-app-1, fastapi-iris-demo-iris-1
    fastapi-iris-demo-app-1   | INFO  [alembic.runtime.migration] Contexte impl IRISImpl.
    fastapi-iris-demo-app-1   | INFO  [alembic.runtime.migration] Cela suppose un DDL non transactionnel.
    fastapi-iris-demo-app-1   | INFO:     Surveillance des modifications apportées aux répertoires : ['/usr/src/app']
    fastapi-iris-demo-app-1   | INFO:     Uvicorn lancé sur http://0.0.0.0:8000 (Appuyez sur CTRL+C pour quitter)
    fastapi-iris-demo-app-1   | INFO:     Lancement du processus de rechargement [8] à l'aide de StatReload
    fastapi-iris-demo-app-1   | INFO:     Lancement du processus de serveur [10]
    fastapi-iris-demo-app-1   | INFO:     En attente du démarrage de l'application.
    fastapi-iris-demo-app-1   | INFO:     Démarrage de l'application achevé.

    FastAPI utilise le projet pydantic, pour déclarer le schéma de données, et nous en avons besoin aussi, créons app/schemas.py, les mêmes colonnes que dans models.py mais sous une forme simple en Python

    from pydantic import BaseModel
    
    
    classTodoCreate(BaseModel):
        title: str
        description: str
    
    
    classTodo(TodoCreate):
        id: int
    
        classConfig:
            from_attributes = True

    Déclaration des opérations crud dans app/crud.py, où nous travaillons avec la base de données en utilisant l'ORM de SQLAlchemy.

    from sqlalchemy.orm import Session
    from . import models, schemas
    
    
    defget_todos(db: Session, skip: int = 0, limit: int = 100):return db.query(models.Todo).offset(skip).limit(limit).all()
    
    
    defcreate_todo(db: Session, todo: schemas.TodoCreate):
        db_todo = models.Todo(**todo.dict())
        db.add(db_todo)
        db.commit()
        db.refresh(db_todo)
        return db_todo
    

    Pour finir, nous pouvons mettre à jour notre app/main.py, et ajouter des itinéraires pour lire et créer des todos.

    from fastapi import FastAPI, Depends
    from .db import init_db, get_session
    from . import crud, schemas
    
    app = FastAPI(
        title='TODO Application',
        version='1.0.0',
    )
    
    
    @app.on_event("startup")defon_startup():
        init_db()
    
    
    @app.get("/ping")asyncdefpong():return {"ping": "pong!"}
    
    
    @app.get("/todo", response_model=list[schemas.Todo])asyncdefread_todos(skip: int = 0, limit: int = 100, session=Depends(get_session)):
        todos = crud.get_todos(session, skip=skip, limit=limit)
        return todos
    
    
    @app.post("/todo", response_model=schemas.Todo)asyncdefcreate_todo(todo: schemas.TodoCreate, session=Depends(get_session)):return crud.create_todo(db=session, todo=todo)
    

    La page de documentation "docs" a été mise à jour en conséquence, et nous pouvons maintenant jouer avec.

     
    Essayez !
    Ajouter une nouvelle todo
    <p>
      <img src="/sites/default/files/inline/images/images/image(6813).png" />
    </p>
    
    <p>
      Et vérifiez ce que nous avons ici
    </p>
    
    <p>
      <img src="/sites/default/files/inline/images/images/image(6814).png" />
    </p>
    

    Vérifions-le dans IRIS

    ─$ docker-compose exec iris irissqlcli iris+emb:///
    Serveur:  IRIS pour UNIX (Ubuntu Server LTS pour les conteneurs "ARM64 Containers") 2023.2 (Build 227U) Mon Jul 31 2023 17:43:25 EDT
    Version: 0.5.4
    [SQL]irisowner@/usr/irissys/:USER> .tables
    +-------------------------+
    | TABLE_NAME              |
    +-------------------------+
    | SQLUser.alembic_version |
    | SQLUser.todo            |
    +-------------------------+
    Temps: 0.043s
    [SQL]irisowner@/usr/irissys/:USER> select * from todo
    +----+-------+---------------------+
    | id | titre | description         |
    +----+-------+---------------------+
    | 1  | démo  | cela marche vraiment |
    +----+-------+---------------------+
    1 rang dans le jeu
    Temps: 0.004s
    [SQL]irisowner@/usr/irissys/:USER> select * from alembic_version
    +--------------+
    | version_num  |
    +--------------+
    | 1e4d3b4d51ca |
    +--------------+
    1 rang dans le jeu
    Temps: 0.045s
    [SQL]irisowner@/usr/irissys/:USER>

     

    J'espère que vous avez apprécié la facilité d'utilisation de Python et de FastAPI pour la création de REST. Le code source de ce projet est disponible sur github https://github.com/caretdev/fastapi-iris-demo

    0
    0 126
    Article Lorenzo Scalese · Sept 27, 2023 16m read

    Cette publication soutient la démonstration au Global Summit 2023 "Demos and Drinks" avec des détails très probablement perdus dans le bruit de l'événement. Il s'agit d'une démonstration sur la façon dont on peut utiliser les capacités FHIR SQL d'InterSystems du Serveur FHIR avec la solution Super Awesome Identity and Resolution, Zingg.ai pour détecter les enregistrements en double dans votre référentiel FHIR, et l'idée de base derrière la remédiation de ces ressources avec le PID^TOO|| en cours de construction actuellement inscrit dans le programme Incubateur d'InterSystems. Si vous êtes dans

    0
    0 68
    Article Sylvain Guilbaud · Sept 14, 2023 8m read

    Aperçu

    La documentation en ligne contient une référence expliquant comment définir et utiliser les requêtes de classes.

    La personnalisation des procédures stockées en ObjectScript s'est avérée utile pour accéder au stockage NoSQL et à la messagerie externe via l'intégration, afin de présenter la sortie sous forme de tableau.

    Par exemple : une application qui utilise déjà 90 % d'interaction SQL depuis un frontal peut alors également étendre cet accès aux 10 % restants des fonctionnalités requises de la plate-forme, via le même accès SQL.

    0
    0 106
    Discussion Sylvain Guilbaud · Sept 11, 2023

    Actuellement, les privilèges SQL (SELECT, INSERT, UPDATE, DELETE) sont gérés au niveau des tables, ce qui peut s'avérer très fastidieux lorsque vous devez administrer de nombreux rôles dans une organisation et les synchroniser avec des modèles de données en constante évolution.
    En gérant les privilèges au niveau des schémas, cela permettra d'accorder des privilèges SELECT et d'autres privilèges DML à *tous* ou *plusieurs schémas* à un rôle|utilisateur, corrigeant ainsi le besoin de synchroniser manuellement les nouvelles tables|vues avec les rôles.

    4
    0 90
    Question Franck Hanotin · Sept 8, 2023

    Bonjour,

    J'ai une globale dont la structure est à plusieurs niveaux et j'essaie à travers une class et une requête SQL d'afficher un tableau qui comprend toutes les valeurs et les niveaux.

    ^AFO("Site","Ville")="66722,3743"
    ^AFO("Site","Ville","111BB","OBT")=",MMM,XXX,"
    ^AFO("Site","Ville","111OW","OBT")=",XXX,MMM,"
    ^AFO("Site","Ville","AANVRBIBS","zzz")    =    "1^^1"
    ^AFO("Site","Ville","AANVRBIBS","zzz","*","dut")    =    "*afhalen waar gevonden"
    ^AFO("Site","Ville","AANVRBIBS","zzz","*","eng")    =    "*Pickup where found"
    ^AFO("Site","Ville","AANVRBIBS","zzz","*","fre")    =    "*Lieu où trouvé"

    7
    0 214
    Article Sylvain Guilbaud · Août 31, 2023 7m read

    Description du cas

    Imaginons que vous soyez un développeur Python ou que vous disposiez d'une équipe bien formée et spécialisée en Python, mais que le délai dont vous disposez pour analyser certaines données dans IRIS est serré. Bien entendu, InterSystems propose de nombreux outils pour toutes sortes d’analyses et de traitements. Cependant, dans le scénario donné, il est préférable de faire le travail en utilisant les bons vieux Pandas et de laisser l'IRIS pour une autre fois.

    0
    0 125
    Question Sylvain Guilbaud · Août 28, 2023

    Je recherche dans DBeaver un moyen efficace permettant de filtrer les tables systèmes (ex: appartenant à un schéma commençant par "%").

    En utilisant un utilisateur possédant le rôle %All, DBeaver nous affiche une longue liste de schémas systèmes, qui nous oblige à descendre la liste avant d'accéder aux tables utilisateurs.

    En créant un utilisateur dans IRIS avec des droits restreints permet de réduire cette liste, mais on perd l'intérêt du rôle %All.

    3
    0 446
    InterSystems officiel Benjamin De Boe · Juil 4, 2023

    InterSystems IRIS Cloud SQL est un service cloud entièrement géré qui apporte la puissance des capacités de base de données relationnelles d'InterSystems IRIS utilisées par des milliers d'entreprises clientes à un large public de développeurs d'applications et de professionnels des données. InterSystems IRIS Cloud IntegratedML est une option de cette base de données en tant que service qui offre un accès facile à de puissantes capacités d'apprentissage automatique automatisé sous une forme SQL native, via un ensemble de commandes SQL simples qui peuvent facilement être intégrées dans le code d'application pour augmenter avec des modèles ML qui s'exécutent près des données.

    Aujourd'hui, nous annonçons le programme d'accès pour les développeurs pour ces deux offres. Les développeurs d'applications peuvent désormais s'inscrire eux-mêmes au service, créer des déploiements et commencer à créer des applications composables et des services de données intelligents, l'approvisionnement, la configuration et l'administration étant entièrement pris en charge par le service.

    0
    0 40
    Annonce Benjamin De Boe · Juin 27, 2023

    La semaine dernière, lors du Global Summit, nous avons annoncé notre nouvelle fonctionnalité Foreign Tables, qui a été introduite en tant que fonctionnalité expérimentale avec la version 2023.1 plus tôt cette année. Nous vous invitons maintenant à rejoindre le Programme d'accès anticipé pour les tables étrangères et à tester cette nouvelle fonctionnalité, afin que vous puissiez nous faire savoir si elle répond à vos besoins et quelles fonctionnalités nous devrions ensuite prioriser.

    0
    0 53
    Article Guillaume Rongier · Juin 26, 2023 3m read

    Introduction

    Dans certains des derniers articles, j'ai parlé des types entre IRIS et Python, et il est clair qu'il n'est pas facile d'accéder aux objets d'un côté à l'autre.  

    Heureusement, un travail a déjà été fait pour créer SQLAlchemy-iris (suivez le lien pour le voir sur Open Exchange), qui rend tout beaucoup plus facile pour Python d'accéder aux objets d'IRIS, et je vais montrer les starters pour cela.

    Merci à @Dmitry Maslennikov !

    Installation

    Pour l'installer, il suffit d'ouvrir votre terminal avec un accès administrateur et de taper

    pip install sqlalchemy-iris

    et les pré-requis seront également installés pour vous, si nécessaire.

    Utilisation

    Maintenant, sur un fichier python, vous pouvez importer le module, vous connecter à la base de données et jouer avec sqlalchemy comme vous le souhaitez. Si vous vous sentez à l'aise, vous pouvez suivre les étapes suivantes :

    • Importez "create_engine" de sqlalchemy et créez le moteur avec la chaîne "iris://username:password@IP:port/namespace". Bien sûr, vous pouvez importer tout le module, mais "create_engine" crée une instance de Engine (sqlalchemy.engine, pour plus d'informations cliquez ici) qui a toutes les sous-classes nécessaires pour ce que je présente ici..
    from sqlalchemy import create_engine
    
    engine = create_engine("iris://_SYSTEM:SYS@localhost:1972/SAMPLE")
    • Créez la connexion (sqlalchemy.engine.connection, pour plus d'informations cliquez ici) ainsi vous pourrez travailler avec des transactions, des exécutions simples, etc.
    conn = engine.connect()

    C'est très bien ! Vous avez maintenant configuré l'accès à votre base de données.

    Pour une simple requête SELECT, et pour itérer à travers l'ensemble des résultats, faites ce qui suit (comme d'habitude, en utilisant comme exemple le tableau créé dans cet article):

    query = 'SELECT Name, Age  from Sample.PersistentData WHERE Age >=21'
    result = conn.exec_driver_sql(query)

    Maintenant, le résultat est un CursorResult (sqlalchemy.engine.CursorResult). Vous pouvez vérifier tout ce que vous pouvez faire avec un CursorResult ici, dans la documentation officielle. C'est tout ce que vous avez à faire pour une simple itération :

    print("Name, Age")
    for row in result:
        print(row[0], ", ", row[1])

     et avec un peu de formatage, vous pouvez avoir un résultat du type suivant :

    Maintenant comme vous savez par où commencer, vous pouvez également consulter la documentation officielle pour plus de détails et de possibilités.

    PS : vous pouvez également importer "text" de sqlalchemy et exécuter la requête comme suit

    result = conn.execute(text(query))

    ce qui produira exactement les mêmes résultats.

    Conclusion

    Vous pouvez également exécuter des DDL et toute autre instruction DML, et il y a un support encore plus important pour travailler avec un un mapping objet-relationnel ORM (_Object Relational Mapping), _mais comme ceci n'est qu'un "démarrage", je n'irai pas plus loin.

    Souhaitez-vous plus de tutoriels avec SQLAlchemy ? Peut-être la prochaine fois en utilisant ORM ?
    N'hésitez pas à me contacter si vous avez des doutes !

    0
    1 618
    Article Sylvain Guilbaud · Mai 19, 2023 3m read

    Apache Superset est une plate-forme moderne d'exploration et de visualisation des données. Superset peut remplacer ou augmenter les outils de business intelligence propriétaires pour de nombreuses équipes. Superset s'intègre bien à une variété de sources de données.

    Désormais, il est également possible de l'utiliser avec InterSystems IRIS.

    Une démo en ligne est disponible et elle utilise SQL d'IRIS Cloud comme source de données.

    Apache Superset fournit un certain nombre d'exemples, qui ont été chargés avec succès dans IRIS sans aucun problème, et affichés sur des tableaux de bord d'exemple.

    Le support d'IRIS est implémenté avec un paquetage Python nommé superset-iris, qui peut être installé manuellement dans Superset.

    Superset utilise SQLAlchemy comme moteur de base de données, tandis que le paquet superset-iris utilise sqlalchemy-iris.

    Lorsque le paquet est installé dans l'environnement Superset, il devient possible de sélectionner InterSystems IRIS dans la liste des bases de données prises en charge.

    Pour se connecter à la base de données IRIS, il faut un URI SQLAlchemy sous la forme suivante: iris://{login}:{password}@{hostname}:{port}/{namespace}

    La connexion de test doit vérifier la disponibilité du serveur. Cliquez ensuite sur Connecter pour terminer l'ajout de la base de données.

    Dans le même formulaire d'édition de base de données, dans l'onglet avancé Advanced Tab, et dans le bloc de sécurité Security, l'option nommée Autoriser le téléchargement de fichiers vers la base de données, qui permettra de télécharger des fichiers CSV et de construire des tableaux avec des données dans IRIS en se basant sur ces derniers.

    Le Labo SQL, qui permet d'effectuer des requêtes SQL

    Il permet également de collecter et d'afficher des renseignements sur les schémas et les tableaux existants, de prévisualiser ces tableaux et de proposer la construction d'une simple requête SQL avec toutes les colonnes.

    Pour l'essayer localement, clonez le dépôt

    git clone https://github.com/caretdev/superset-iris.git superset-iris
    cd superset-iris

    Lancez Superset avec Docker-Compose

    docker-compose pull
    docker-compose up -d

    Lancez Superset avec Docker-Compose Pendant le démarrage, il importe les données d'exemple dans la base de données IRIS, cela prendra un certain temps, pour attendre que ce soit fait, exécutez la commande suivante

    docker-compose logs -f superset-init

    Lorsque la commande ci-dessus a fini de fonctionner, allez à http://localhost:8088/dashboard/list/. Les panneaux de bord sont disponibles sans autorisation. Pour accéder au Labo SQL, utilisez admin/admin comme login et mot de passe.

    Veuillez voter sur le concours

    0
    0 210