在使用cx_Oracle和python的查询中,通过字典和列表传递值有什么区别?

在使用cx_Oracle和python的查询中,通过字典和列表传递值有什么区别?,python,oracle,Python,Oracle,以下查询工作正常(通过字典传递值) 但下面按列表传递值不起作用“Variable_TypeByValue():未处理的数据类型tuple” cursor.execute("""insert into MDP_ERR_MASTER (MARKERID, FILENAME, ERRORCODE, USERID, CHECKEDBY, CHECKEDDT, STATUS, COMMENTS, X1, Y1, Z1, X2, Y2, Z2, RECNO, PROJECT_CODE, SRC_ACC_NU

以下查询工作正常(通过字典传递值)

但下面按列表传递值不起作用“Variable_TypeByValue():未处理的数据类型tuple”

cursor.execute("""insert into MDP_ERR_MASTER (MARKERID, FILENAME, ERRORCODE, USERID, CHECKEDBY, CHECKEDDT, STATUS, COMMENTS, X1, Y1, Z1, X2, Y2, Z2, RECNO, PROJECT_CODE, SRC_ACC_NUM, WORKAREA, CONFIGID, ELEMENTID)
            values (:1,:2,:3,'0',:4,sysdate,'OPEN',:5,:6,:7,0,:8,:9,0,1,:10,:11,chr(182) || :12 || chr(182),0,0)""",
            [(1 , markerId),
             (2 , str(errorMarkerLayer.name())),
             (3 , errCode),
             (4 , self.sysid),
             (5 , str(comments)),
             (6 , startPnt[0]),
             (7, startPnt[1]),
             (8 , endPnt[0]),
             (9, endPnt[1]),
             (10 , self.jobNo),
             (11 , src_AcNum),
             (12 , self.wrkArea)
             ]) 

提供列表时,参数将根据列表中的位置包括在查询中,而不是通过查找键。因此,对于第一个值,
(1,markedId)
代替了
markerId

虽然元组列表可以很容易地转换为字典,但它不是相同的数据结构。首先使用
dict()
将参数转换为字典将起作用

cursor.execute("""insert into MDP_ERR_MASTER (MARKERID, FILENAME, ERRORCODE, USERID, CHECKEDBY, CHECKEDDT, STATUS, COMMENTS, X1, Y1, Z1, X2, Y2, Z2, RECNO, PROJECT_CODE, SRC_ACC_NUM, WORKAREA, CONFIGID, ELEMENTID)
            values (:1,:2,:3,'0',:4,sysdate,'OPEN',:5,:6,:7,0,:8,:9,0,1,:10,:11,chr(182) || :12 || chr(182),0,0)""",
            dict([(1 , markerId),
             (2 , str(errorMarkerLayer.name())),
             (3 , errCode),
             (4 , self.sysid),
             (5 , str(comments)),
             (6 , startPnt[0]),
             (7, startPnt[1]),
             (8 , endPnt[0]),
             (9, endPnt[1]),
             (10 , self.jobNo),
             (11 , src_AcNum),
             (12 , self.wrkArea)
             ])) 
如果您使用的是cx_Oracle,请参阅以获取文档。

在列表中(第二个代码示例),您仍然有“命名”参数。而不是像“:markerid“youhave”:1”这样的好名字。我认为在使用命名参数时必须使用字典

如果需要使用数字命名参数,只需使用数字键名构建字典

如果您只是需要位置替换,那么我相信可能支持“?”语法,但我不推荐“?”语法,因为它很难维护,并且您必须在输入中多次指定相同的值


另一个选项是使用pythons字符串格式/替换运算符“%”,这意味着您在执行查询之前要处理参数替换。

(“插入到MDP\u ERR\u MASTER中(MARKERID、文件名、错误代码、用户ID、CHECKEDBY、CHECKEDDT、状态、注释、X1、Y1、Z1、X2、Y2、Z2、RECNO、项目代码、SRC_ACC_NUM、工作区、CONFIGID、ELEMENTID)值(:1、:2、:3、'0'、:4、系统日期、'OPEN'、:5、:6、:7,0、:8、:9,0,1、:10、:11、chr(182);:12 | chr(182)、0、'00000、'1843'、'erroru标记),[(c1541')(c13')(c513'),',(4,'3695'),(5,,(6151.9789870760234),(7,-27.427017698343075),(8151.9806782163743),(9,-27.42280863791423),(10,'J-13013'),(11,'C1133'),(12,'Maranoa Part02_1'))第二个参数仍然是一个列表。您需要将其转换为字典,正如我在回答中所说的,将值列表传递到dict()函数中。
cursor.execute("""insert into MDP_ERR_MASTER (MARKERID, FILENAME, ERRORCODE, USERID, CHECKEDBY, CHECKEDDT, STATUS, COMMENTS, X1, Y1, Z1, X2, Y2, Z2, RECNO, PROJECT_CODE, SRC_ACC_NUM, WORKAREA, CONFIGID, ELEMENTID)
            values (:1,:2,:3,'0',:4,sysdate,'OPEN',:5,:6,:7,0,:8,:9,0,1,:10,:11,chr(182) || :12 || chr(182),0,0)""",
            dict([(1 , markerId),
             (2 , str(errorMarkerLayer.name())),
             (3 , errCode),
             (4 , self.sysid),
             (5 , str(comments)),
             (6 , startPnt[0]),
             (7, startPnt[1]),
             (8 , endPnt[0]),
             (9, endPnt[1]),
             (10 , self.jobNo),
             (11 , src_AcNum),
             (12 , self.wrkArea)
             ]))