Как установить соединение в Python для подключения as400 и вызова любых программ as400 с параметром

Кто-нибудь знает, как установить соединение в Python для подключения системы as400 iseries и вызова любых программ as400 с параметром.

Например, как создать библиотеку, подключив as400 через python. Я хочу вызвать " CRTLIB LIB(TEST) " из скрипта Python.

Я могу подключиться к базе данных DB2 через пакет pyodbc.

Вот мой код для подключения базы данных 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)

2 ответа

Решение

Если ваш IBM i настроен на это, вы можете вызвать QCMDEXC хранимая процедура с использованием CALL в вашем SQL. Например,

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)')

В этой главе показано, как подключиться к AS/400 через pyodbc:

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

Несколько заметок; в этом примере SYSTEM DSN вы настроили для AS/400 в with pyodbc.connect заявление. Вы также можете переключить это, чтобы 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. Удачи!

Другие вопросы по тегам