如何在 python 中建立连接以连接 as400 并使用参数调用任何 as400 程序

How to make connection in python to connect as400 and call any as400 programs with parameter

任何人都知道如何在 python 中建立连接以连接 as400 系列系统并使用参数调用任何 as400 程序。

例如如何通过python连接as400来创建库。我想从 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)

此要点展示了如何通过 pyodbc 连接到 AS/400:

https://gist.github.com/BietteMaxime/6cfd5b2dc2624c094575

一些注意事项;在此示例中,SYSTEM 是您在 with pyodbc.connect 语句中为 AS/400 设置的 DSN。您也可以通过以下修改将其切换为 SERVERPORT

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。祝你好运!

如果您的 IBM i 设置为允许它,您可以在 SQL 中使用 CALL 调用 QCMDEXC 存储过程 .例如,

c1.execute("call qcmdexc('crtlib lib(test)')")

QCMDEXC 存储过程存在于 QSYS2 中(实际程序对象是 QSYS2/QCMDEXC1),其功能与 QSYS 中熟悉的同名程序非常相似,但存储过程专门用于通过 SQL.

调用

当然,要让这个例子起作用,您的连接配置文件必须具有创建库的适当权限。

也有可能您的 IBM i 设置为允许此操作。我不知道启用此功能的具体内容,但在我工作的地方,我们有一个分区,上面显示的示例正常完成,而另一个分区我得到这个:

pyodbc.Error: ('HY000', '[HY000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0901 - SQL system error. (-901) (SQLExecDirectW)')