4

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

2 回答 2

1

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

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

QCMDEXC存储过程存在于 QSYS2 中(实际的程序QSYS2/QCMDEXC1对象是

当然,要使这个示例正常工作,您的连接配置文件必须具有创建库的适当权限。

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

pyodbc.Error: ('HY000', '[HY000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0901 - SQL system error. (-901) (SQLExecDirectW)')
于 2017-12-14T23:56:41.273 回答
1

此要点显示如何通过以下方式连接到 AS/400 pyodbc

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

于 2017-12-14T14:35:55.557 回答