Article
· Août 31, 2023 7m de lecture

Utilisation de SQLAlchemy pour transférer des tables vers et depuis IRIS

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.

Pour la situation mentionnée ci-dessus et bien d’autres cas, vous souhaiterez peut-être récupérer des tables depuis IRIS pour gérer les données en dehors des produits InterSystems. Cependant, vous pouvez aussi avoir besoin de procéder dans l'autre sens lorsque vous disposez d'une table externe dans n'importe quel format, à savoir CSV, TXT ou Pickle, que vous devez importer dans IRIS et utiliser les outils d'IRIS pour l'exploiter.
Que vous deviez ou non faire face à un problème décrit ci-dessus, Innovatium m'a appris que connaître plusieurs moyens de résoudre un problème de codage peut toujours s'avérer utile. La bonne nouvelle est que vous n'avez pas besoin de passer par le processus fastidieux de création d'une nouvelle table, de transfert de toutes les lignes et d'ajustement de chaque type lorsque vous importez une table depuis IRIS.

    Cet article vous montrera comment transformer rapidement une table IRIS en une trame de données Pandas et inversement avec seulement quelques lignes de code. Vous pouvez consulter le code sur mon GitHub, où vous pouvez trouver un Jupiter Notebook avec chaque étape de ce tutoriel.

 

Récupérer les données d'une table d'IRIS

Bien entendu, vous devez commencer par importer les bibliothèques requises pour ce projet.

import pandas as pd
import sqlalchemy as db

Votre prochaine étape consistera à 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 comme argument. 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 - the easiest way to use Python and SQL with IRIS's databases.

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

Ensuite, nous pouvons déclarer la variable qui contiendra le bloc de données et appeler la fonction read_sql_table() de Pandas sur cette connexion, en spécifiant le nom de la table sous forme de 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 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 la table avec laquelle nous travaillons existe dans le schéma que nous voulons utiliser et, bien sûr, s'il existe un schéma dont nous avons besoin en premier lieu. Dans la dernière section de cet article, vous apprendrez comment procéder en plus de quelques conseils supplémentaires. À partir de maintenant, si vous maîtrisez 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 vers IRIS

Avant de commencer, modifions quelque chose dans notre bloc de données, à titre d'exemple. Nous pouvons adapter les valeurs d'une colonne en fonction de 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 ajouté une nouvelle personne et une colonne basée sur les données existantes. . Vous pouvez consulter l’illustration suivante pour voir le résultat.

Nous pouvons désormais le renvoyer à IRIS en une seule ligne de code. Tout ce dont nous avons besoin est de spécifier le moteur et le nom de la table.

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

Encore une fois, nous devons mettre le schéma dans un argument séparément du nom de la table pour éviter certaines erreurs et comportements indésirables. De plus, l'argument if_exists spécifie quoi faire s'il existe déjà une table portant le même nom dans le schéma donné. Les valeurs possibles sont : replace, fail (valeur par défaut) et append. Bien sûr, l'option replace supprime la table et en crée une nouvelle avec une commande SQL, tandis que append ajoutera les données à la table existante. N'oubliez pas que cette méthode ne vérifiera pas les valeurs répétées, alors soyez prudent lorsque vous utilisez cet attribut. Enfin, l'option fail génère l'erreur suivante en cas d'existence de la table :

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

Vous pouvez désormais interroger IRIS pour voir les nouveautés ou accéder au portail d'administration dans la partie dédiée à SQL. N'oubliez pas que si vous avez utilisé la valeur de remplacement, vous devez tenir compte du code source de la classe car la méthode l'a complètement réécrit. Cela signifie que si vous avez implémenté des méthodes, vous devez les laisser dans une superclasse.

Plus de conseils sur sqlalchemy-iris

Si vous rencontrez des problèmes que vous ne parvenez pas à 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 l’aide dont vous avez besoin dans cette section. Vous découvrirez ici une liste de conseils pour trouver des détails sur le moteur et le dialecte.

Fonctionnalités spécifiques au dialect

SQL Alchemy fonctionne sur des dialectes 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 sélectionné est sqlalchemy-iris by Dmitry Maslennikov

Vous pouvez accéder et modifier ses fonctionnalités avec la propriété 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 vérifier le code source sur CaretDev's GitHub.

Vérification des schémas disponibles dans un moteur

Une fonction spéciale du dialecte qui mérite d'être soulignée est la fonction get_schema_names(). Attention! Les informations suivantes peuvent être cruciales pour vous si vous souhaitez éviter les erreurs dans votre code et lors des itérations.

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

 

Vérification des tables disponibles dans un schéma

Regardons une situation similaire. Vous avez peut-être également besoin de connaître les tables 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. La même variable que vous utiliserez pour accéder à une autre fonction, get_table_names(). Elle renverra une liste avec les noms de tables dans le schéma spécifié ou dans le schéma « SQLUser » par défaut.

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

De plus, si vous souhaitez utiliser davantage 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 SQL Alchemy Documentation et sqlalchemy-iris GitHub Repository. Alternativement, vous pouvez m'envoyer un message ou laisser un commentaire, et nous essaierons de découvrir le secret ensemble.

Considérations finales

L'approche d'implémentation présentée dans cet article met l'accent sur l'utilisation des instances IRIS comme fournisseurs de Cloud et permet de réaliser une analyse sur différentes bases. Il permet de les surveiller tous simultanément dans chacune de leurs qualités et de comparer leurs performances et leur utilisation. Si vous combinez ces connaissances avec le développement décrit dans cet autre article à propos d'un portail réalisé avec Django, vous pouvez rapidement créer un gestionnaire puissant avec autant de fonctionnalités et d'instances que souhaitées.

Cette implémentation est également un moyen efficace de déplacer des données extérieures à IRIS vers une classe bien construite. Étant donné que vous connaissez peut-être 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. Oui, je dois vous avertir que l'intégration avec InterSystems de certains types n'est pas une fonctionnalité intégrée et peut donc ne pas être très simple. Cependant, l'union de SQL Alchemy et Pandas sera toujours utile pour exporter des données depuis IRIS.
Par conséquent, dans cet article, nous avons appris qu'IRIS dispose de tous les outils dont vous avez besoin pour vous aider dans le développement et l'intégration facile avec les appareils existants de votre système ou autres gadgets dont vous êtes experts.

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