是否有人使用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.type
,self.debitparty
等是Python实例变量并具有值。TYPE
,DRPARTY
,CRPARTY
等是TEMPPF
的字段。更像是填充“sql'变量如下:
sql = "select * from TEMPLIB.TEMPPF"
所以某处我没有正确地制作INSERT格式。有人知道格式吗?我在Internet上尝试了几种格式,但它们与Python不兼容,或者它们不是很好的例子。
答案 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()