Question Cécile Heuillet · Déc 21, 2023

ERREUR <Ens>ErrCanNotAcquireJobRootLock

Bonjour,

j'utilise une méthode en python sur une opération pour pouvoir générer un fichier csv à partir d'une table de lien. Cette méthode me génère l'erreur : ERREUR <Ens>ErrCanNotAcquireJobRootLock et cela me bloque complètement pour l'arrête de la production. Mon opération passe en statut "Queued" alors que le fichier est généré et mon message de retour est complet.

La méthode principale de l'opération est :

Method extractionPiecesSage(pRequest As myDSO.msg.exportPiecesSage, Output pResponse As myDSO.msg.retourExport) As%Status
{
    set sc = $$$OKset pResponse = ##class(myDSO.msg.retourExport).%New()
    set tFilename = pRequest.sFilename
    set tQuery = "SELECT * xxxxxxxxxx"set tConnexion = ""Try {
        
        do..creerFichierCSV(tQuery, tFilename)
        do..ajouterStreamFichier(tFilename, .pResponse)

        if pResponse.MessageStream.Size '= 0 {
            set pResponse.sFilename = tFilename
            set pResponse.bIsExportOk = 1
        }
        else {
            set pResponse.bIsExportOk = 0
        }  
    }
    Catch ex {
        Set sc = ex.AsStatus()
    }
    Return sc
}

Et la méthode pour générer le csv est la suivante :

ClassMethod creerFichierCSV(query As%String, filename As%String) [ Language = python ]
{
    import pandas as pd
    from sqlalchemy import create_engine
    engine = create_engine('iris+emb:///')  
    df = pd.read_sql(query,engine)
    try:
        df.to_csv(filename, index=False, header = True, encoding='utf-8', sep =';')
    except Exception as e:
                self.log_info(f"Une erreur s'est produite : {e}")
    return
}

Je ne parviens pas à trouver ce qui cloche. Auriez vous ne suggestion svp?

Merci par avance pour votre aide.

Bien cordialement,

Cécile

Product version: IRIS 2023.3

Comments

Guillaume Rongier · Déc 21, 2023

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 :

0
Guillaume Rongier · Fév 6, 2024

Je viens d'en discuter avec le developpeur du driver SQLAlchemy, c'est un problème connu de SQLAlchemy avec EmbeddedPython, les transactions ne sont jamais relachées.

Un correctif arrivera bientot, d'ici là, une solution peut etre de forcer l'autoCommit:

engine = create_engine('iris+emb:///', connect_args={'autoCommit': True})
0