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



任何人都知道如何在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

连接到/400

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

一些笔记;在此示例中,SYSTEM是您在with pyodbc.connect语句中为/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。祝你好运!

相关内容

  • 没有找到相关文章

最新更新