用字典列表更新sql表

jmp7cifd  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(752)

如何在sql查询中正确使用字典?我应该预定义sql变量以防止sql注入吗?e、 我在python中尝试用dictionary更新表时遇到了一个错误,但是query在纯sql中使用预定义的变量和值时工作得非常好。 _mysql_connector.MySQLInterfaceError: Incorrect datetime value: '1' for column 'colF' at row 1 我的字典

{'ID': 1, 'colA': 'valA1', 'colB': 'valB1', 'colC': 'valC1', 
        'colD': 'valD1', 'colE': 'valE1', 'colF': datetime.datetime(2017, 12, 23, 0, 0), 
'colG': datetime.datetime(2018, 
        7, 11, 0, 0), 'colH': datetime.datetime(2018, 9, 1, 0, 0)}

sql语句

UPDATE table1
    SET 
    colA = CASE \
    WHEN %(valA1)s IS NOT NULL THEN %(valA1)s 
    END,\
    colB = CASE \
    WHEN %(valB1)s IS NOT NULL THEN %(valB1)s 
    END,\
    colC = CASE \
    WHEN %(valC1)s IS NOT NULL THEN %(valC1)s 
    END,\
    colD = CASE \
    WHEN %(valD1)s IS NOT NULL THEN %(valD1)s 
    END,\
    colE = CASE \
    WHEN %(valE1)s IS NOT NULL THEN %(valE1)s 
    END,\
    colF = CASE\
    WHEN  %(valF)s IS NOT NULL THEN %(valF)s
    END,\
    colG = CASE\
    WHEN  %(valF1)s IS NOT NULL THEN %(valF1)s 
    END,\
    colH = CASE\
    WHEN  %(valH1)s IS NOT NULL THEN %(valH1)s
    END\
    WHERE %(ID)s = Id """

格式化查询字符串时

colF1 = CASE  
    WHEN  2018-07-11 00:00:00 IS NOT NULL THEN 2018-07-11 00:00:00 
    END,
    colH1 = CASE
    WHEN  2018-09-01 00:00:00 IS NOT NULL THEN 2018-09-01 00:00:00
    END 
    WHERE  Id = 1

还有另一个问题 when value is not null . 我想语法是错的。

z0qdvdin

z0qdvdin1#

尝试参数化查询时出现了几个问题:
如mysqldb docs所述,参数占位符中不能使用列或表标识符。此类占位符仅用于文字值。另外,考虑多行的三引号字符串以避免 \ 换行符:

sql = """UPDATE table1
         SET 
           colA = CASE 
                     WHEN colA IS NOT NULL 
                     THEN %(valA1)s 
                  END,
         ...
      """

cur.execute(sql, mydict)
con.commit()

要使用命名占位符方法,字典键必须与占位符名称匹配。目前,您需要反转字典中的大多数键/值顺序,而您只需要正确地为 ID . 但是,如上#1所述,删除所有列标识符:

{'ID': 1, 'valA1': 'data value', 'valB1': 'data value', 'valC1': 'data value', ... }

大多数数据库(包括mysql)中的日期时间必须采用字符串形式 YYYY-MM-DD HH:MM:SS . mysql引擎无法执行python的 datetime() 物体。但是,某些dbiapi可能能够转换此对象类型。

{'valF': '2017-12-23 00:00:00', 
 'valG': '2018-07-11 00:00:00', 
 'valH': '2018-09-01 00:00:00'}

相关问题