Python使用for循环操作MySQL表时查询语句逻辑问题咨询
代码行逻辑&问题说明
你贴出的这行代码本身存在语法和逻辑错误,它的设计初衷是校验当前遍历到的文件是否已标记为已访问存在于数据库中,但写法不符合Python MySQL操作的规范:
- 从设计逻辑上,这行代码想要实现的功能是:拼接SQL查询语句,查找
dicom2表中filename字段等于当前遍历的文件路径i、且flag字段等于变量ID(值为Visited)的记录 - 从错误点来看:
- MySQL的等值判断用单个
=,不是双等号==,直接写==会触发SQL语法报错 cur.execute()的返回值是SQL执行影响的行数,而非可再次执行的SQL对象,后续cur.execute(qur)的写法完全错误,会直接抛出异常- 直接用字符串拼接SQL的方式存在SQL注入风险,也可能因为文件名包含单引号等特殊字符导致SQL执行失败,必须使用参数化查询
- MySQL的等值判断用单个
功能修正代码
你需要的「遍历文件、不存在则入库」的功能可以按如下正确写法实现:
import glob # 这里替换为你实际使用的MySQL驱动,比如pymysql import pymysql # 自行补全数据库连接逻辑,conn为连接对象,cur为游标对象 conn = pymysql.connect(host='你的数据库地址', user='用户名', password='密码', database='库名', charset='utf8mb4') cur = conn.cursor() ID = "Visited" files_ = glob.glob("test/**/*.dcm", recursive=True) for file_path in files_: # 参数化查询,避免SQL注入和特殊字符问题 cur.execute("SELECT filename FROM dicom2 WHERE filename = %s AND flag = %s", (file_path, ID)) data = cur.fetchall() if data: print("EXIST") else: cur.execute("INSERT INTO dicom2(filename, flag) VALUES(%s, %s)", (file_path, ID)) # 非自动提交的连接需要手动提交事务 conn.commit() print("Added") cur.close() conn.close() print("Done")
内容的提问来源于stack exchange,提问作者Nimesh Kumar
相关产品推荐
相关产品推荐

