Pendant longtemps (environ 3 mois), j'ai utilisé "Execute SQL script" de la solution client IBM pour émettre du SQL et acquérir des données, mais comme le nombre de données dépassait 5000, je souhaitais les acquérir toutes. Comme il est devenu difficile de faire défiler sans fin, j'ai essayé une expérience d'acquisition par lots en utilisant Python et ODBC.
Puisqu'il s'agit d'un code expérimental, la vérification des erreurs et le format des résultats de sortie sont ignorés.
Environnement PC
Environnement de destination de connexion
Obtenez le dernier stabilisateur sur python.org et installez-le. Après l'installation, mettez le chemin vers le dossier contenant "python.exe".
La raison pour laquelle j'ai choisi pypyodbc au lieu du pyodbc général est que l'installation avec pip a échoué. J'ai également essayé ibm_db recommandé par IBM, mais cette fois, c'est un chemin car les deux nécessitaient Microsoft Visual C ++ 14.
Installez en utilisant "pip" attaché à python.
pip install pypyodbc
Je l'ai installé il y a quelques mois, donc je me souviens du contenu. Accédez à https://www.ibm.com/support/pages/ibm-i-access-client-solutions. Suivez le lien qui dit «Téléchargements pour IBM i Access Client Solutions». Il vous sera demandé d'authentifier votre ID IBM en cours de route, donc si vous avez un ID, entrez-le, sinon enregistrez-en un nouveau (gratuitement). Cliquez sur "ACS Windows App Pkg English (64bit)" pour télécharger.
Puisqu'il est au format du programme d'installation, installez-le selon la procédure d'installation.
odbctest.py
import pypyodbc
#Obtenir les informations de connexion
config = {}
with open("connection_config.txt", 'r', encoding="utf-8") as conf:
for line in conf.read().splitlines():
key_, val_ = line.replace(" ", "").split("=")
config[ key_ ] = val_
#Connexion DB
connection = pypyodbc.connect(
driver='{iSeries Access ODBC Driver}',
system = config["system"],
uid = config["uid"],
pwd = config["pwd"] )
cur = connection.cursor()
#Exécution SQL
statement = open("statement.sql", 'r', encoding="utf-8").read()
cur.execute( statement )
for row in cur:
print( row )
La source est à peu près divisée en 3 parties.
"Obtenir les informations de connexion" récupère les informations de connexion à la base de données à partir d'un fichier externe et les stocke dans le dictionnaire. Le fichier externe "connection_config.txt" ressemble à ceci:
connection_config.txt
system = xxx.xxx.xxx.xxx
uid = USER
pwd = PASWORD
Dans "Connexion à la base de données", les informations de connexion lues sont utilisées pour essayer de se connecter à la base de données et acquérir le curseur.
En "exécution SQL", le SQL écrit dans le fichier externe est lu et passé à execute () du curseur pour émettre le SQL. La boucle for en dessous jette chaque ligne dans la fonction print () et l'écrit dans la sortie standard.
statement.sql
select * from QSYS2.LIBLIST
Écrivons le SQL ci-dessus dans statement.sql et exécutons-le.
>python testodbc.py
(1, 'QSYS', 'QSYS', 'SYSTEM', 0, '\x0eäýäþämäwäáäÝäbäJäÝäÞäì\x0f')
(2, 'QSYS2', 'QSYS2', 'SYSTEM', 0, 'CPI\x0eá¶àªäýäþämäwäáäÝäbäJäÝäÞäì\x0f')
(3, 'QHLPSYS', 'QHLPSYS', 'SYSTEM', 0, None)
(4, 'QUSRSYS', 'QUSRSYS', 'SYSTEM', 0, 'S Mohe Hote L Caine Ane Mo Kanane U Heone He')
(5, 'QIWS', 'QIWS', 'PRODUCT', 0, None)
(6, 'QGPL', 'QGPL', 'USER', 0, 'GENERAL PURPOSE LIBRARY')
(7, 'QTEMP', 'QTEMP', 'USER', 0, None)
Les caractères déformés sont par conception ... Les étiquettes de certains objets fournis par IBM ne semblent pas bien se traduire, mais s'il s'agit d'une table normalement créée, que vous utilisiez des fonctionnalités spécifiques à SQL ou AS / 400, le japonais Le convertira en caractères lisibles sans problème.
Si vous redirigez vers un fichier, des dizaines de milliers de résultats devraient prendre des secondes à des dizaines de secondes. Bien que cela dépende des performances du serveur, lorsque j'ai essayé d'exécuter 15 colonnes x 10000 enregistrements et une quantité légèrement plus importante de SQL, l'écriture s'est terminée en environ 5 secondes (taille du fichier de sortie 1 Mo).
Cela vous libère des pénalités liées au maintien sans fin de la touche Page suivante pour obtenir l'ensemble des résultats.
Recommended Posts