在SQLite3(DB Browser)中按邮箱匹配删除行报错,求解决方案
解决SQLite3中删除指定邮箱对应行的报错问题
嘿,我瞅你这代码里的问题挺明显的,咱们一步步拆解解决:
1. 核心问题:DELETE语句语法错误
你写的SQL语句里DELETE ({coi}) FROM {tn}...是错的——DELETE操作是删除整行数据,不需要在DELETE后面指定列名(如果是要删除某个列的内容,那应该用UPDATE把该列设为NULL;如果是要删除整个列,才用ALTER TABLE DROP COLUMN)。正确的删除行的语法应该是:
DELETE FROM table_name WHERE column_name = 'value'
2. 第二个坑:直接拼接用户输入的SQL注入风险+字符串转义问题
你用format把用户输入的邮箱直接拼进SQL语句里,不仅容易因为邮箱里包含单引号(比如test'@example.com)导致语法报错,还会带来SQL注入的安全隐患。SQLite支持参数化查询,用占位符?来替代变量,让数据库自己处理参数的转义和安全问题。
修改后的完整代码示例
column_2 = 'Email' table_name = 'Personal_Information' cn = 'Email' # 这里你之前变量名重复了,其实可以直接用column_2就行 deleting_user = easygui.multenterbox(msg1, title, fieldNames) deleting_email = deleting_user[2] # 正确的SQL语句+参数化查询 dbCursor.execute("DELETE FROM {tn} WHERE {cn} = ?".format(tn=table_name, cn=column_2), (deleting_email,)) # 别忘了提交事务!如果是操作数据库的写操作,必须提交才能生效 dbConnection.commit()
额外提醒
- 执行完DELETE操作后,一定要调用
dbConnection.commit()提交事务,不然你的删除操作不会真正写入数据库。 - 如果你的需求其实是删除某一行里的Email列的值(不是删除整行),那应该用UPDATE语句:
dbCursor.execute("UPDATE {tn} SET {cn} = NULL WHERE {cn} = ?".format(tn=table_name, cn=column_2), (deleting_email,)) dbConnection.commit()
内容的提问来源于stack exchange,提问作者Beni billhardt
相关产品推荐
相关产品推荐

