Как установить соединение в 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. Удачи!