検索

お知らせ
· 2025年10月23日

Consultad bases de datos de InterSystems IRIS con la API DB de Python.

Hola, comunidad:

¿Sois desarrolladores de Python? Si es así, ¡ya podéis empezar a crear aplicaciones con InterSystems IRIS sin necesidad de aprender un nuevo lenguaje de programación!

Use Python with InterSystems IRIS. Try the exercise.  

👨‍💻 Probad este ejercicio para empezar rápidamente a usar la interfaz DB-API de Python y conectar con una base de datos de InterSystems IRIS para ejecutar consultas SQL.

💬 ¿Cuál fue vuestra experiencia con el ejercicio? ¡Contádmelo en los comentarios!

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2025年10月23日 1m read

[Quick tip] - Como usar URL en servicios REST API sin distinción entre mayúsculas y minúsculas

Hola a todos,

Este es un rápido consejo de como usar URL en servicios RES API sin distinción de mayúsculas y minúsculas.

Si tienes una clase que extiende de %CSP.REST y Ens.BusinessService, para crear un servicoi REST API, y tienes definido tu WebApplication en minúsculas

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="/user" Method="POST" Call="User"/>
    <Route Url="/login" Method="POST" Call="Login"/>
</Routes>
}

Solo aceptará URL en minúsculas, por ejemplo: http://myserver/myproduction/user

Si tienes algún caractere en mayúscula, la URL no funciona. http://MyServer/MyProduction/user

Es facil de arreglar, solo añade la expresión regular (?i) para permitir cualquier ruta sin distinción entre mayúsculas y minúsculas.

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="(?i)/user" Method="POST" Call="User"/>
    <Route Url="(?i)/login" Method="POST" Call="Login"/>
</Routes>
}

Ahora, acepta ambas URLs:

http://myserver/myproduction/user

http://MyServer/MyProduction/user

Happy code!

2件の新着コメント
ディスカッション (2)2
続けるにはログインするか新規登録を行ってください
記事
· 2025年10月23日 1m read

[Quick tip] - How to use case insensitive url in REST API Business Service

Hi all,

This is a quick tip about how to use case insensitive URL in REST API.

If you have a class that extends from %CSP.REST and Ens.BusinessService, to create a REST API service, and you have defined your WebApplication in lowercase

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="/user" Method="POST" Call="User"/>
    <Route Url="/login" Method="POST" Call="Login"/>
</Routes>
}

Only accepts the url in lowercase, i.e. http://myserver/myproduction/user

If you have any uppercase character, the url doesn't work. http://MyServer/MyProduction/user

It is easy to fix, only add the regular expression (?i) to allow case insensitive path.

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="(?i)/user" Method="POST" Call="User"/>
    <Route Url="(?i)/login" Method="POST" Call="Login"/>
</Routes>
}

Now, it can accept both URL:

http://myserver/myproduction/user

http://MyServer/MyProduction/user

Happy code!

2件の新着コメント
ディスカッション (2)3
続けるにはログインするか新規登録を行ってください
記事
· 2025年10月23日 6m read

Écriture d'un service API REST pour exporter les données patient générées au format .csv

Salut,

C'est moi encore 😁. Je travaille actuellement à la génération de fausses données patients à des fins de test avec Chat-GPT et Python. J'aimerais également partager mon apprentissage. 😑

Tout d'abord, créer un service d'API REST personnalisé est facile en utilisant %CSP.REST.

Commençons ! 😂

1. Créez une classe datagen.restservice qui étend %CSP.REST.

Class datagen.restservice Extends %CSP.REST
{
Parameter CONTENTTYPE = "application/json";
}

2. Ajoutez une fonction genpatientcsv() pour générer les données du patient et les regrouper dans une chaîne csv

Class datagen.restservice Extends %CSP.REST
{
Parameter CONTENTTYPE = "application/json";
ClassMethod genpatientcsv() As %String [ Language = python ]
{
    # w ##class(datagen.restservice).genpatientcsv()
    # python.exe -m pip install faker
    # python.exe -m pip install pandas

    from faker import Faker
    import random
    import pandas as pd
    from io import StringIO

    # Initialize Faker
    fake = Faker()

    def generate_patient(patient_id):
        return {
            "PatientID": patient_id,
            "Name": fake.name(),
            "Gender": random.choice(["Male", "Female"]),
            "DOB": fake.date_of_birth(minimum_age=0, maximum_age=100).strftime("%Y-%m-%d"),
            "City": fake.city(),
            "Phone": fake.phone_number(),
            "Email": fake.email(),
            "BloodType": random.choice(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]),
            "Diagnosis": random.choice(["Hypertension", "Diabetes", "Asthma", "Healthy", "Flu"]),
            "Height_cm": round(random.uniform(140, 200), 1),
            "Weight_kg": round(random.uniform(40, 120), 1),
        }

    # Generate 10 patients
    patients = [generate_patient(i) for i in range(1, 11)]

    # Convert to DataFrame
    df = pd.DataFrame(patients)

    # Convert to CSV string (without saving to file)
    csv_buffer = StringIO()
    df.to_csv(csv_buffer, index=False)
    csv_string = csv_buffer.getvalue()

    return csv_string
}
}

vous pouvez tester la fonction dans le terminal en tapant

w ##class(datagen.restservice).genpatientcsv()

3. Ajoutez une fonction GetMyDataCSV() en Python pour renseigner la chaîne CSV sous forme de fichier CSV, puis l'afficher via l'API REST. Pour ce faire, procédez comme suit :

3.1. Appelez la fonction de génération de données patient pour obtenir la chaîne CSV ;
3.2. Définissez %response.ContentType = "text/csv" ;
3.3. Définissez la valeur de l'en-tête « Content-Disposition » sur « attachment; filename=mydata.csv » ;
3.4. Écrivez la chaîne CSV générée en sortie.

N'oubliez pas d'installer les bibliothèques associées via PIP.

Class datagen.restservice Extends %CSP.REST
{
Parameter CONTENTTYPE = "application/json";
ClassMethod GetMyDataCSV() As %Status
{
    // Build CSV string
    Set tCSVString = ##class(datagen.restservice).genpatientcsv()

    //Set headers and output CSV
    Set %response.ContentType = "text/csv"
    Do %response.SetHeader("Content-Disposition","attachment; filename=mydata.csv")
    
    // Output the data
    W tCSVString

    Quit $$$OK
}

ClassMethod genpatientcsv() As %String [ Language = python ]
{
    # w ##class(datagen.restservice).genpatientcsv()
    # python.exe -m pip install faker
    # python.exe -m pip install pandas

    from faker import Faker
    import random
    import pandas as pd
    from io import StringIO

    # Initialize Faker
    fake = Faker()

    def generate_patient(patient_id):
        return {
            "PatientID": patient_id,
            "Name": fake.name(),
            "Gender": random.choice(["Male", "Female"]),
            "DOB": fake.date_of_birth(minimum_age=0, maximum_age=100).strftime("%Y-%m-%d"),
            "City": fake.city(),
            "Phone": fake.phone_number(),
            "Email": fake.email(),
            "BloodType": random.choice(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]),
            "Diagnosis": random.choice(["Hypertension", "Diabetes", "Asthma", "Healthy", "Flu"]),
            "Height_cm": round(random.uniform(140, 200), 1),
            "Weight_kg": round(random.uniform(40, 120), 1),
        }

    # Generate 10 patients
    patients = [generate_patient(i) for i in range(1, 11)]

    # Convert to DataFrame
    df = pd.DataFrame(patients)

    # Convert to CSV string (without saving to file)
    csv_buffer = StringIO()
    df.to_csv(csv_buffer, index=False)
    csv_string = csv_buffer.getvalue()

    return csv_string
}
}

4. Ajoutez la route à cette fonction et compilez la classe

Class datagen.restservice Extends %CSP.REST
{
Parameter CONTENTTYPE = "application/json";
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
        <Route Url="/export/patientdata" Method="GET" Call="GetMyDataCSV"/>
</Routes>
}

ClassMethod GetMyDataCSV() As %Status
{
    // Build CSV string
    Set tCSVString = ##class(datagen.restservice).genpatientcsv()

    //Set headers and output CSV
    Set %response.ContentType = "text/csv"
    Do %response.SetHeader("Content-Disposition","attachment; filename=mydata.csv")
    
    // Output the data
    W tCSVString

    Quit $$$OK
}

ClassMethod genpatientcsv() As %String [ Language = python ]
{
    # w ##class(datagen.restservice).genpatientcsv()
    # python.exe -m pip install faker
    # python.exe -m pip install pandas

    from faker import Faker
    import random
    import pandas as pd
    from io import StringIO

    # Initialize Faker
    fake = Faker()

    def generate_patient(patient_id):
        return {
            "PatientID": patient_id,
            "Name": fake.name(),
            "Gender": random.choice(["Male", "Female"]),
            "DOB": fake.date_of_birth(minimum_age=0, maximum_age=100).strftime("%Y-%m-%d"),
            "City": fake.city(),
            "Phone": fake.phone_number(),
            "Email": fake.email(),
            "BloodType": random.choice(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"]),
            "Diagnosis": random.choice(["Hypertension", "Diabetes", "Asthma", "Healthy", "Flu"]),
            "Height_cm": round(random.uniform(140, 200), 1),
            "Weight_kg": round(random.uniform(40, 120), 1),
        }

    # Generate 10 patients
    patients = [generate_patient(i) for i in range(1, 11)]

    # Convert to DataFrame
    df = pd.DataFrame(patients)

    # Convert to CSV string (without saving to file)
    csv_buffer = StringIO()
    df.to_csv(csv_buffer, index=False)
    csv_string = csv_buffer.getvalue()

    return csv_string
}
}

OK, maintenant notre code est prêt. 😁 La prochaine étape consiste à ajouter le service REST à l'application Web

Saisissez Path, Namespace, et Rest service class name, puis enregistrez

Attribuez le rôle d'application approprié à cette application Web (parce que je suis paresseux, j'attribue simplement %All pour les tests 🤐)

OK, tout est prêt ! 😁 Testons l'API REST ! 😂

Saisissez le chemin suivant dans un navigateur.

http://localhost/irishealth/csp/mpapp/export/patientdata

Cela déclenche le téléchargement d'un fichier nommé mydata.csv 😗

Vérifions le fichier 😊

Ouais ! Ça marche bien ! 😁😁

Merci beaucoup pour votre lecture. 😉

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2025年10月23日 4m read

Python embebido e IRIS en Jupyter Notebook en un entorno virtual

Estoy documentando una demostración de InterSystems IRIS que incluye Python embebido y Jupyter Notebook desplegados en el mismo contenedor, junto con una aplicación de Python embebido desarrollada en ese entorno de Jupyter Notebook.

He utilizado el contenedor Docker creado por @Bob Kuszewski como entorno de desarrollo para mostrar cómo se puede crear una aplicación de Python embebido, capaz de enviar y recuperar datos desde y hacia InterSystems IRIS. La ventaja de usar este contenedor como entorno de desarrollo es que se trata de un entorno virtual con el IDE de Jupyter y IRIS conectados y ejecutándose en paralelo. El uso de esta configuración frente a cualquier otra puede justificarse por la prueba de velocidad de ingesta y consulta de datos que realicé en varias plataformas, donde InterSystems IRIS ofreció la tasa más rápida tanto de ingesta como de consulta de datos.

La aplicación de Python embebido escrita en Jupyter Notebook obtiene datos CSV de un catálogo de conjuntos de datos externo llamado data.world mediante Pandas, y almacena los datos en una clase de IRIS que se ejecuta en el mismo contenedor.

Dado que la instancia de IRIS se ejecuta en un contenedor Docker, no hay acceso a Studio, por lo que he utilizado VS Code para crear clases en la instancia de IRIS. Podemos conectarnos a IRIS y programar en ObjectScript usando las extensiones de InterSystems para Servers Manager y ObjectScript, respectivamente.

Una vez que los datos se almacenan en IRIS, he utilizado una consulta SQL para acceder a ellos y guardarlos en un DataFrame.

import iris
query = "SELECT Property, Property, Property, Property, Property, FROM Namespace.Class"
iris.sql.exec(query)

Después, he utilizado Plotly, una biblioteca usada para la visualización y el análisis de datos, para generar un gráfico de barras a partir de los datos almacenados en la clase de IRIS. Me he basado en dash-python-iris para el uso de la biblioteca pyplot de Python en la visualización.

Código de la aplicación

import pandas as pd
df = pd.read_csv('https://query.data.world/s/tus52dys57qbhqz4qjmla3r34pnuti')

number = df['Number']
name = df['Name']
symbol = df['Symbol']
marketcap = df['Market Cap']
price = df['Price']
supply = df['Circulating Supply']
tfhr = df['Volume (24hr)']
import iris
for i in range(1515):

    num = number.loc[i]
    nam = name.loc[i]
    sym = symbol.loc[i]
    mc = marketcap.loc[i]
    pr = price.loc[i]
    sup = supply.loc[i]
    tf = tfhr.loc[i]
     

    setData = iris.cls("vizdata.vizdata")._New()

    setData.Number = str(num)

    setData.Name = str(nam)

    setData.Symbol = str(sym)

    setData.Marketcap = str(mc)

    setData.Price = str(pr)

    setData.Supply = str(sup)

    setData.TwentyFourHour = str(tf)

    setData._Save()

import iris
import plotly.express as px
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
query = "SELECT TOP 20 Name, Number, Marketcap, Price, Symbol, TwentyFourHour FROM vizdata.vizdata"
df = iris.sql.exec(query).dataframe().sort_values(by='price', ascending = False)

print(df)

fig = px.bar(df.head(20), x="name", y="price", barmode="group", text_auto='.3s')

fig.update_traces(textfont_size=12, textangle=0, textposition="outside", cliponaxis=False)

fig.update_layout(height=330)

fig.show()

Video de demostración

https://www.loom.com/share/4c26cd5c719a48789b6a67295db816ed

 

Recursos utilizados

Referencias

  1. Dash-Python: https://community.intersystems.com/post/dash-python-iris
  2. Documentación de la prueba de velocidad: https://usconfluence.iscinternal.com/x/lSBwIQ
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください