问题
sql_add = 'insert into images(id, gray1, contrast1, gray2, contrast2, level) values(%s, %s, %s, %s, %s, %s)'
cur.execute(sql_add, (str_id, str_gray1, str_contrast1, str_gray2, str_contrast2, str_level))
原因
官方文档有这样一句话: You shouldn’t assemble your query using Python’s string operations because doing so is insecure;
意思是SQL 语句在传参时,应该避免使用 Python 的字符串操作,因为这样做不安全。
解决
正确的做法是,在需要使用值的位置用占位符? 替代。有两种占位符:qmark style 和named style
- qmark:
cur.execute("create table lang (name, first_appeared)") - named style:
cur.execute("select * from lang where first_appeared=:year", {"year": 1972})
修该后:
sql_add = 'insert into images(id, g, c, l) values(?, ?, ?, ?, ?, ?)'
cur.execute(sql_add, (str_id, str_g, str_c, str_l))
很奇怪,在使用 MySQL 的时候并没有相关错误!
参考:
- DB-API 2.0 interface for SQLite databases? ——官方文档,值得好好读一读
|