任何人都知道如何在Python中建立连接以连接AS400 Iseries System并用参数调用任何AS400程序。
例如,如何通过连接AS400通过Python创建库。我想从Python脚本中称为" crtlib lib(test)"。
我能够通过PYODBC软件包连接到DB2数据库。
这是我连接DB2数据库的代码。
import pyodbc
connection = pyodbc.connect(
driver='{iSeries Access ODBC Driver}',
system='ip/hostname',
uid='username',
pwd='password')
c1 = connection.cursor()
c1.execute('select * from libname.filename')
for row in c1:
print (row)
如果您的IBM I设置为允许,则可以使用SQL中的CALL
调用QCMDEXC
存储过程。例如,
c1.execute("call qcmdexc('crtlib lib(test)')")
QCMDEXC
存储的过程属于QSYS2(实际程序对象是QSYS2/QCMDEXC1
),并且与居住在QSYS中的同名程序的熟悉程序大致相同,但是存储的过程专门通过SQL来调用。<<<<<<<<<<<<<<<<<<<<<<<</p>
当然,要使此示例工作,您的连接配置文件必须具有适当的授权来创建库。
您的IBM I 也可能不是设置以允许这样做。我不知道启用此功能的确切是什么,但是在我工作的地方,我们有一个分区,上面显示的示例正常完成,而我得到的另一个分区:
pyodbc.Error: ('HY000', '[HY000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0901 - SQL system error. (-901) (SQLExecDirectW)')
此要点显示了如何通过 pyodbc
:
https://gist.github.com/biettemaxime/6cfd5b2dc2624c094575
一些笔记;在此示例中,SYSTEM
是您在with pyodbc.connect
语句中为/400设置的DSN。您也可以将其切换为使用这些修改的SERVER
和PORT
:
import pyodbc
class CommitMode:
NONE = 0 # Commit immediate (*NONE) --> QSQCLIPKGN
CS = 1 # Read committed (*CS) --> QSQCLIPKGS
CHG = 2 # Read uncommitted (*CHG) --> QSQCLIPKGC
ALL = 3 # Repeatable read (*ALL) --> QSQCLIPKGA
RR = 4 # Serializable (*RR) --> QSQCLIPKGL
class ConnectionType:
READ_WRITE = 0 # Read/Write (all SQL statements allowed)
READ_CALL = 1 # Read/Call (SELECT and CALL statements allowed)
READ_ONLY = 2 # Read-only (SELECT statements only)
def connstr(server, port, commit_mode=None, connection_type=None):
_connstr = 'DRIVER=iSeries Access ODBC Driver;SERVER={server};PORT={port};SIGNON=4;CCSID=1208;TRANSLATE=1;'.format(
server=server,
port=port,
)
if commit_mode is not None:
_connstr = _connstr + 'CommitMode=' + str(commit_mode) + ';'
if connection_type is not None:
_connstr = _connstr + 'ConnectionType=' + str(connection_type) + ';'
return _connstr
def main():
with pyodbc.connect(connstr('myas400.server.com', '8471', CommitMode.CHG, ConnectionType.READ_ONLY)) as db:
cursor = db.cursor()
cursor.execute(
"""
SELECT * FROM IASP.LIB.FILE
"""
)
for row in cursor:
print(' '.join(map(str, row)))
if __name__ == '__main__':
main()
我也清理了一些PEP-8。祝你好运!