You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中如何将变量传入方法以从SQLite数据库删除数据

问题分析与修复方案

嘿,我帮你揪出了代码里几个关键问题,咱们一个个来解决:

1. SQL语句的逻辑错误

你写的DELETE FROM domains WHERE name = name;是个大坑!这里的name = name是个恒成立的条件——意思是“删除所有name字段等于自身的记录”,而数据库里几乎所有记录的name都等于自身,所以这行代码会把整张表的记录全删掉,完全没用到你传进来的参数。

正确的做法是用参数化查询,用占位符代替直接写变量(SQLite里用?):

DELETE FROM domains WHERE name = ?;

2. 参数传递的语法问题

你传参数的时候写了(name),但在Python里,单个元素的括号表达式不是元组,只是把变量包了层括号而已。数据库驱动需要接收元组类型的参数,所以必须加个逗号,写成(name,),这样才会被识别为元组。

3. 其他潜在问题

  • 你代码最后提前写了cursor.close(),这会导致函数还没执行数据库操作,cursor就已经关闭了,肯定会报错。要等所有数据库操作完成后再关闭cursor和连接。
  • 别忘了调用searchdb(delete_domain),不然你定义的函数根本不会执行删除操作。

修正后的完整代码示例

# 假设已经建立了数据库连接,sql是有效的cursor对象
delete_domain = 'm.com'

# 先确保表存在
sql.execute('''CREATE TABLE if not exists domains (name TEXT NOT NULL PRIMARY KEY, clock CHAR(100) NOT NULL, person TEXT, reason TEXT);''')

def searchdb(name):
    # 使用参数化查询,传递正确的元组参数
    sql.execute("DELETE FROM domains WHERE name = ?;", (name,))
    sql.commit()  # 提交修改到数据库
    print(f"Record for {name} successfully deleted")

# 调用函数执行删除
searchdb(delete_domain)

# 所有操作完成后再关闭cursor和连接
# sql.close()
# conn.close()  # 如果有连接对象的话

这样修改后,代码就能正确删除指定域名的记录啦~

内容的提问来源于stack exchange,提问作者James Middleton

火山引擎 最新活动