Использование SQL с соединителем IBM_DB в Python - PullRequest
0 голосов
/ 23 мая 2018

Кто-нибудь использовал пакет ibm_db с IBM Python для PASE для обновления файлов Db2 в IBM i (ранее AS / 400)?

Я хочу использовать скрипты Python (из QSH) для обновления Db2база данных.Моя цель - заполнить значения во время выполнения и обновить поля файлов Db2.Он работает со статическими (жестко закодированными) значениями, но не с динамическими.

Вот то, что я пытаюсь, но это не работает:

import ibm_db

c1 = ibm_db.connect('*LOCAL','userid','password') 
sql = """INSERT INTO TEMPLIB.TEMPPF (TYPE, DRPARTY, CRPARTY, 
                                     AMOUNT,ACNUM, DESCRIPT) 
          VALUES('%s', '%s', '%s', '%s', '%s', '%s'), 
          %(self.type, self.debitparty, self.creditparty, self.amount, 
            self.craccountnumber, self.description) with NC
      """

stmt = ibm_db.exec_immediate(c1, sql ) 
  • self.type, self.debitparty и т. Д. Являются переменными экземпляра Python и имеют значения.
  • TYPE, DRPARTY, CRPARTY и т. Д. Являются полями TEMPPF.

Что-топроще, как заполнение переменной 'sql', как показано ниже:

sql = "select * from TEMPLIB.TEMPPF"

Так что где-то я не делаю формат INSERT правильно.Кто-нибудь знает формат, пожалуйста?Я испробовал несколько форматов, доступных в Интернете, но они не совместимы с Python или не являются хорошими примерами.

1 Ответ

0 голосов
/ 23 мая 2018

Во-первых, ваша конкатенация строк с оператором модуля неверна, поскольку %(vars) должен находиться вне строки, предназначенной для форматирования.

Во-вторых, вы должны использовать параметризацию SQL (отраслевой стандарт в любая база данных, а не только DB2), а не строковая интерполяция данных и оператора запроса.Вы можете сделать это с помощью модуля ibm_db_dbi для передачи параметров в курсоре execute call:

import ibm_db
import ibm_db_dbi   # ADD DBI LAYER

db = ibm_db.connect('*LOCAL','userid','password') 

# ADD FOR PYTHON STANDARD DB-API PROPERTIES (I.E., CURSOR)
conn = ibm_db_dbi.Connection(db)   
cur = conn.cursor()

# PREPARED STATEMENT (WITH PLACEHOLDERS)
sql = """INSERT INTO TEMPLIB.TEMPPF (TYPE, DRPARTY, CRPARTY, 
                                     AMOUNT, ACNUM, DESCRIPT) 
          VALUES(?, ?, ?, ?, ?, ?)
          with NC
      """

# EXECUTE ACTION QUERY BINDING PARAMS
cur.execute(sql, (self.type, self.debitparty, self.creditparty, self.amount, 
                  self.craccountnumber, self.description)) 

cur.close()
conn.close()
...