Ok, effectivement, les choses semblent avoir changées.

D'apres la doc kong : https://docs.konghq.com/gateway/latest/kong-manager/auth/super-admin/#cr...

Lors de la migration de kong, tu dois passer le paramètre : KONG_PASSWORD

Activer le RBAC : KONG_ENFORCE_RBAC: 'on'

Et te connecter avec :

Login : kong_admin et Mot de passe : Celui spécifié dans la migration

Après tu dois avoir accès au bouton Invite Admin

Dans mes souvenirs, c'est pas trivial d'activer le RBAC pour Kong car on a vite fait de se retrouver à l’extérieur de la maison sans les clés.

Il y a quelques temps, j'ai créé un tuto sur Kong avec une procedure pour creer un utilisateur admin, l'idée c'est de créer le compte admin avant de forcer l'RBAC :

https://github.com/grongierisc/kong-ee-training?tab=readme-ov-file#10-se...

J'espere que cette procédure est toujours valide avec la version 3.4

Wow tant de récompenses ! Merci à tous les membres de la communauté qui ont contribué à ce succès. C'est un honneur de faire partie de cette communauté. Je suis très heureux de voir que les membres de notre communauté ont été récompensés pour leur travail acharné. Cela montre que nous sommes une communauté active et que nous avons beaucoup à offrir. Je suis impatient de voir ce que l'année prochaine nous réserve !

Je ne connais pas l'impact sur les performances, je pense qu'il est minime dans ton scénario.

Cependant, dans le cas d'insertion en batch (+100 000 d'un coup), je passerai peut etre pas d'autre méthode que SQLAlchemy que je ne connais pas tres bien, je ne sais pas par exemple si il support les methodes `executemany` de db-api.

Avant de rentrer dans ces considerations d'optimisation, faisons en sorte que le flux fonctionne ;)

effectivement, il y a un problem de lock avec SQLAlchmy et embedded python.

ce que tu proposes, c'est de passer d'une connexion SQLAlchmy avec EmbeddedPython vers une connexion classique sur TCP/IP.

Pourquoi cela ne fonctionnerait pas en production ?

Tu as à variabiliser les login et mot de passe et le tour est joué.

L'adresse du server ne doit pas changer, ca sera toujours localhost dans ton cas.

Bonjour @Cyril Grosjean 
 

Je me demande si ton problème n'est pas en relation avec cette erreur : https://fr.community.intersystems.com/post/erreur-errcannotacquirejobroo...

L'idée, c'est que si tu déclares une connexion avec SQLAlchmy en mode embedded, une transaction est ouverte automatique, la solution proposée est après l'utilisation SQLalchmy fermer la connexion avec un dispose.

Les bons sites pour commencer à apprendre le python sont :

Ensuite, je m'inspirerai des examples cités dans la réponse précédente.

Un article dédié sur Python et IRIS doit sortir pour l'année prochain, il présentera les similitudes (qui sont nombreuses) et aussi les différences entre l'ObjectScript et le Python.

Patience :)

Bonjour,

C'est la connexion sqlalchemy qui creer une transaction qui n'est jamais relâchée, le code suivant devrait fonctionner:

ClassMethod creerFichierCSV(
	query As %String,
	filename As %String) [ Language = python ]
{
    import pandas as pd
    from sqlalchemy import create_engine,text
    engine = create_engine('iris+emb:///')
    try:
        df = pd.read_sql(text("SELECT * from Ens_Util.Log"),engine)
    except Exception as e:
        raise e
    finally:
        engine.dispose()

    df.to_csv("toto", index=False, header = True, encoding='utf-8', sep =';')

    return
}

Pour relâcher la transaction, aller dans :

Puis selection la transaction :

et enfin, la terminer :

Je ne sais pas si VsCode support cette fonctionnalité, ce pendant, il est tout à fait possible d'ouvrir un ticket pour en faire une demande :

https://github.com/intersystems-community/vscode-objectscript/issues

J'imagine que ces propriétés sont liées aux objects projects qui aident aux déploiements.

Pour accéder aux options de projets il faut monter un dossier isfs qui fait la passerelle entre iris et vscode :

https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls...

Bonjour,

Je rencontre aussi ce problème, c'est lié à la version 2023.1 d'iris et pas à VsCode. La redirection des erreurs dans la sortie standard ne se fait pas systématiquement.

C'est résolu à partir de la 2023.3.

Un workaround :

Do $system.OBJ.SetQualifiers("/multicompile=0",1)

Cette commande désactive la compilation parallèle dans tout le système. Cela ne pose pas de problème si des classes individuelles sont compilées. Par contre, elle est plus lente pour de nombreuses classes. Mais vous pouvez le réactiver en utilisant le CompileFlag /multicompile=1 si vous devez compiler beaucoup de classes à la fois :

do $SYSTEM.OBJ.Compile("Demo.Demo","/multicompile=1",.err)

Bonjour,

J'aurai besoin d'un example de model où l'erreur arrive.

De plus, peux tu essayer de mettre à jour le driver db-api d'iris, nous avons récemment corrigé des problèmes par rapport aux TINYINT et aux streams.

pip install intersystems_iris@https://github.com/intersystems-community/intersystems-irispython/releases/download/3.7.3/intersystems_iris-3.7.3-py3-none-any.whl --upgrade

Sinon, tu peux toujours soumettre un bug sur l’interpréteur django pour iris ici:

https://github.com/caretdev/django-iris

Salut Cyril,

La méthode PutStream() prend un objet %Stream d'IRIS en paramètre. Il faut donc que tu convertisses ton fichier en %Stream avant de l'envoyer.

Exemple :

XMessage

from grongier.pex import Message
from dataclasses import dataclass

@dataclass
class XMessage(Message):
    StringStream: str
    BinaryStream: bytes

BusinessOperation

from grongier.pex import BusinessOperation
from datetime import datetime
from X.xImport import XMessage
import iris

class XArticleExport(BusinessOperation):
    def get_adapter_type():
        return "EnsLib.FTP.OutboundAdapter"

    def on_init(self):
        return super().on_init()

    def on_message(self, request: XMessage):
        if hasattr(request, "Stream"):
            # Préparation du stream
            stream = iris.cls("%Stream.GlobalCharacter")._New()
            source = ""
            # Si le stream est en string on l'utilise tel quel
            if request.StringStream:
                source = request.StringStream
            elif request.BinaryStream:
                source = request.BinaryStream.decode("utf-8")

            # On écrit le contenu du fichier dans le stream
            n = 4092
            chunks = [source[i:i+n] for i in range(0, len(source), n)]
            for chunk in chunks:
                stream.Write(chunk)

            filename = "exportArticles_" + datetime.now().strftime("%Y%m%d") + ".csv"
            esc: int = self.Adapter.PutStream(filename, stream)
            if esc == 1:
                self.log_info("File imported successfully with code : " + esc)
        else:
            self.log_error("Pas de stream reçu ! Code: " + esc)
        return super().on_message(request)