在Python中使用SQL和IBM_DB连接器

时间:2018-05-23 01:03:03

标签: python db2 ibm-midrange db2-400

是否有人使用IBM的Python for PASE ibm_db包来更新IBM i(以前的AS / 400)上的Db2文件?

我想使用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.typeself.debitparty等是Python实例变量并具有值。
  • TYPEDRPARTYCRPARTY等是TEMPPF的字段。

更像是填充“sql'变量如下:

sql = "select * from TEMPLIB.TEMPPF"

所以某处我没有正确地制作INSERT格式。有人知道格式吗?我在Internet上尝试了几种格式,但它们与Python不兼容,或者它们不是很好的例子。

1 个答案:

答案 0 :(得分:3)

首先,您使用模数运算符连接字符串是不正确的,因为%(vars)需要驻留在要格式化的字符串之外。

其次,您应该使用SQL参数化(任何数据库中的行业标准,而不仅仅是DB2),而不是数据和查询语句的字符串插值。您可以使用ibm_db_dbi模块在​​游标execute调用中传递参数:

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