OliverXQ
作者OliverXQ2021-06-09 16:10
浪潮商用机器有限公司, 浪潮商用机器企业云创新中心

用Python访问IBM i

字数 3713阅读 17881评论 0赞 3

“ IBM i 上执行一个 Python 程序”一文介绍了如何在 IBM i 上安装配置 Python 运行环境,下面利用这个机会介绍如何用 Python 去访问 IBM i 。

本文将介绍用 Python 来执行 IBM i 的命令和用 Python 访问 Db2 for IBM i 数据库:

  1. 用 Python 执行 IBM i 的命令。

需要安装 Python3-itoolkit 包, Python-itookit 是 IBM 为 IBM i 系统推出的工具包,可以通过程序调用来访问系统资源,通过它可以调用 ILE 程序、服务程序、调用 CL 命令、调用 PASE shell 命令等等。

  1. 用 Python 访问 Db2 for IBM i 数据库。

需要安装 Python3-ibm-db 包,它是 Db2 for IBM i 数据库的连接器,实现对数据库的 native 访问。

下面举几个例子来说明如何利用 P ython 访问 IBM i 。

  1. 用 Python 执行 IBM i 上的命令

基本步骤:

  1. 导入类( Import the class )

  2. 建立到 IBM i 的连接( connect )

  3. 设置要执行的 CL 命令( Set the CL command)

  4. 调用要执行的 CL 命令( Call )

  5. 关闭连接( close connection )

**WRKSYSSTS**

 #coding=utf-8

from itoolkit import *

from itoolkit.transport import DatabaseTransport

import ibm_db_dbi as dbi

doc=open('/test/wajout.txt','w')

conn = dbi.connect()

itransport = DatabaseTransport(conn)

itool = iToolKit()

itool.add(iCmd5250('wrksyssts','WRKSYSSTS'))

itool.call(itransport)

wrksyssts = itool.dict_out('wrksyssts')

print(wrksyssts['wrksyssts'])

print(wrksyssts['wrksyssts'],file=doc)

conn.close()

大家可以看到这个 Python 程序的执行结果和在 AS/400 命令行上执行的结果一摸一样,只是由于在 PASE 里显示的问题

,右侧的一部分没有显示出来。

为了解决显示问题,可以利用 print 语句将 WRKSYSSTS 命令输出到某个文件之中,例如这个小程序是将 WRKSYSSTS 命令的执行结果输出到 /test/wajout.txt 文件,如下图所示,这样 WRKSYSSTS 命令就可以完全显示出来了。

  1. 用 Python 访问 Db2 for IBM i 数据库。

基本步骤:

  1. 导入类( Import the class )

  2. 连接数据库( connect )

  3. 打开游标( Open the cursor)

  4. 设置要执行的 SQL 语句( Set the cursor)

  5. 读取数据库内容( Read )

  6. 关闭游标( close cursor )

  7. 关闭数据库连接( close connection )

下面是一个基本的例子:


 #coding=utf-8

import ibm_db_dbi as dbi

conn = dbi.connect()

sql="select * from xqlib/tablib1"

con1 = conn.cursor()

con1.execute(sql)

print("\n\n ****** Start ******\n\n")

for row in con1.fetchall():

 print(row)

con1.close()

conn.close()

print("\n\n ****** End ******\n\n")

用命令 call qp2term 进入 AS/400 PASE 环境,运行一下这个程序,检查执行结果:

这个 Python 是读取 xqlib 库中的 table1 表,然后,将内容按顺序输出,输出的格式比较简单,不太美观。

下面介绍用 Python 第三方工具 PTable 模块来生成更加美观的 ASCII 格式输出。

#coding=utf-8

import ibm_db_dbi as dbi

from prettytable import from_db_cursor

conn = dbi.connect()

sql="select idn,name,age from xqlib.table1"

con1 = conn.cursor()

con1.execute(sql)

print(from_db_cursor(con1))

con1.close()

conn.close()

用命令 call qp2term 进入 AS/400 PASE 环境,运行一下这个程序,检查执行结果,这中输出就美观多了。

除了用 PTable 库的方法意外,还可以利用 xlsxwriter 模块所提供的强大功能将 DB2 for IBM i 的数据输出到 EXCEL 电子表格中。

#coding=utf-8

import ibm_db_dbi as dbi

from xlsxwriter import Workbook

conn = dbi.connect()

sql="select idn,name,age from xqlib.table1"

con1 = conn.cursor()

con1.execute(sql)

with Workbook('/test/table1.xlsx') as workbook:

 worksheet = workbook.add_worksheet()

 worksheet.write_row('A1',['ID','Name','Age'])

 for rownum,row in enumerate(con1,start=1):

 worksheet.write_row(rownum,0,row)

con1.close()

conn.close()

检查执行结果,大家可以看到 AS/400 上 table1 表中的内容被输出到 EXCEL 电子表格中了。

最后举一个例子是对上面的例子进行扩展,将 Db2 for IBM i 的数据在 EXCEL 电子表格中生成统计图表。


#coding=utf-8

import ibm_db_dbi as dbi

from xlsxwriter import Workbook

conn = dbi.connect()

sql="select name,age from xqlib.table1"

con1 = conn.cursor()

con1.execute(sql)

with Workbook('/test/table2.xlsx') as workbook:

 worksheet = workbook.add_worksheet()

 worksheet.write_row('A1',['Name','Age'])

 for rownum,row in enumerate(con1,start=1):

 worksheet.write_row(rownum,0,row)

 chart=workbook.add_chart({'type':'column'})

 chart.set_title({'name':'Student Stastics'})

 chart.add_series({

 'name':  ' 年龄 ',

 'categories':  '=Sheet1!$A$2:$A'+ str(rownum+1),

 'values':  '=Sheet1!$B$2:$B'+ str(rownum+1)

 })

 worksheet.insert_chart('A5',chart)

con1.close()

conn.close()

执行这个 Python 程序 , 检查执行结果 , 大家可以看到 AS/400 上 table1 表中的内容被输出到 EXCEL 电子表格中 , 同时生成了统计柱状图。

注:

“ IBM i 上执行一个 Python 程序”

链接 https://www.talkwithtrend.com/Article/254917

仅供参考

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表