[PYTHON] J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc

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 d'expérimentation

Environnement PC

Environnement de destination de connexion

Préparation

Obtenez Python

Obtenez le dernier stabilisateur sur python.org et installez-le. Après l'installation, mettez le chemin vers le dossier contenant "python.exe".

Obtenez pypyodbc

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

Obtention de solutions client IBM i Access

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.

Code de test

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.

Résultat d'exécution

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

J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
J'ai essayé de lire les données d'un fichier en utilisant Node.js.
J'ai essayé de faire MAP rapidement une personne suspecte en utilisant les données d'adresse Geolonia
Je souhaite obtenir des attributs de données personnalisés de HTML sous forme d'éléments à l'aide de Python Selenium
J'ai essayé de fonctionner à partir de Postman en utilisant Cisco Guest Shell comme serveur API
Obtenez des données de Twitter avec Tweepy
J'ai essayé d'analyser les données scRNA-seq en utilisant l'analyse des données topologiques (TDA)
J'ai essayé d'obtenir diverses informations de l'API codeforces
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
J'ai essayé de visualiser les données BigQuery à l'aide de Jupyter Lab avec GCP
J'ai essayé de récupérer les données de conversation d'ASKfm
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé de commencer avec Hy
J'ai essayé d'utiliser l'API de données YOUTUBE V3
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé d'utiliser la recherche sélective comme R-CNN
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé d'utiliser Headless Chrome de Selenium
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
J'ai essayé d'obtenir une image en grattant
J'ai essayé de sauvegarder les données avec discorde
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
J'ai essayé de détecter rapidement un mouvement avec OpenCV
J'ai essayé de synthétiser des fichiers WAV en utilisant Pydub.
Comment obtenir des données d'article à l'aide de l'API Qiita
Je veux obtenir les données de League of Legends ②
Je veux obtenir les données de League of Legends ①
Programmation Python: j'ai essayé d'obtenir des informations sur l'entreprise (exploration) de Yahoo Finance aux États-Unis en utilisant BeautifulSoup4
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé d'expliquer l'analyse de régression multiple aussi facilement que possible à l'aide d'exemples concrets.
Programmation Python: j'ai essayé d'obtenir (l'exploration) des articles de presse en utilisant Selenium et BeautifulSoup4
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé de déboguer.
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium