Par exemple, préparez une procédure stockée dans SQL Server qui renvoie un enregistrement qui développe plusieurs enregistrements de n'importe quelle table horizontalement, exécutez le stocké avec SQLAlchemy et récupérez le résultat de l'exécution (vle) avec fetch one (). , Obtenez le nom de la colonne (clm) des données avec les touches (). Si vous répertoriez ces deux éléments avec une fonction zip et en faites un dictionnaire dict, vous pouvez développer le traitement tel que la création d'un fichier XML à l'aide de elementTree dans le processus suivant.
make_dict.py
    import sqlalchemy
    ym = 201603
    CONNECT_INFO = 'mssql+pyodbc://hogehoge' #hoge hoge est n'importe quel DNS(connexion odbc)
    engine = sqlalchemy.create_engine(CONNECT_INFO, encoding='utf-8')
    #Génération de session
    Session = sqlalchemy.orm.sessionmaker(bind=engine)
    session = Session()
    
    #Exécution de procédure stockée
    query = 'EXEC dbo.sp_rtrv4XML @prd = {0}'.format(ym)
    #vle = session.execute(query).fetchall() #Obtenir le résultat de l'exécution:Lorsque plusieurs résultats sont renvoyés
    #print( vle[0][0] )
    vle = session.execute(query).fetchone() #Obtenir le résultat de l'exécution:1 caisse sera retournée
    clm = session.execute(query).keys()  #Obtenir le nom de la colonne
    dc = dict(zip(clm , vle)) #Créer un dictionnaire
    print(dc)
    #Nettoyer après la session
    #session.commit()
    session.close()
Remarque) La base de données à connecter est supposée être SQL Server. Dans le cas de SQLServer, l'exécution stockée est effectuée par l'instruction EXEC.
apdx.sql
--Instruction SELECT qui développe plusieurs enregistrements dans une table horizontalement en un seul enregistrement
;WITH apdx
AS(
    SELECT 1 AS n,'vle1-1' AS fld1 , 'vle1-2' AS fld2 UNION ALL
    SELECT 2 AS n,'vle2-1' AS fld1 , 'vle2-2' AS fld2 UNION ALL
    SELECT 3 AS n,'vle3-1' AS fld1 , 'vle3-2' AS fld2 UNION ALL
    SELECT 4 AS n,'vle4-1' AS fld1 , 'vle4-2' AS fld2 
)
--SELECT *FROM hoge
SELECT 
    MAX(CASE WHEN n= 1 THEN fld1 END )AS fl11
,   MAX(CASE WHEN n= 1 THEN fld2 END )AS fl12
,   MAX(CASE WHEN n= 2 THEN fld1 END )AS fl21
,   MAX(CASE WHEN n= 2 THEN fld2 END )AS fl22
,   MAX(CASE WHEN n= 3 THEN fld1 END )AS fl31
,   MAX(CASE WHEN n= 3 THEN fld2 END )AS fl32
,   MAX(CASE WHEN n= 4 THEN fld1 END )AS fl41
,   MAX(CASE WHEN n= 4 THEN fld2 END )AS fl42
FROM apdx
/* 
Résultat de l'exécution ↓
fl11	fl12	fl21	fl22	fl31	fl32	fl41	fl42
vle1-1	vle1-2	vle2-1	vle2-2	vle3-1	vle3-2	vle4-1	vle4-2
*/
apdx.py
#Créer un dictionnaire à l'aide de la fonction ZIP
   clm = ['fld1','fld2','fld3','fld4']
   vle = ['vle1','vle2','vle3','vle4']
   y = zip(clm,vle)
   print(dict(y))
   # {'fld3':'vle3','fld2':'vle2','fld1':'vle1','fld4':'vle4',}
Recommended Posts