Python 如何在sqlite中用2个变量删除1行?

Python 如何在sqlite中用2个变量删除1行?,python,sqlite,Python,Sqlite,我在sqlite中有一个名为transactions的表: gun | user1 gun | user1 gun | user1 medkit | user1 gun | user2 medkit | user2 等 我只想删除1行gun | user1 所以我提出了一个SQL请求:cursor.execute('DELETE FROM transactions,其中username=:username和item_name=:item_name LIMIT 1',{'username':us

我在sqlite中有一个名为
transactions
的表:

gun | user1
gun | user1
gun | user1
medkit | user1
gun | user2
medkit | user2

我只想删除1行
gun | user1

所以我提出了一个SQL请求:
cursor.execute('DELETE FROM transactions,其中username=:username和item_name=:item_name LIMIT 1',{'username':username,'item_name':item_name})

我发现,
SQLITE ENABLE UPDATE DELETE LIMIT
存在问题,我无法安装它

通过谷歌搜索,我发现我可以做这样的事情:

cursor.execute('''DELETE FROM transactions
               WHERE username in 
               (SELECT * FROM transactions WHERE username=:username AND item_name=:item_name LIMIT 1)
               ''',{'username':username,'item_name':item_name})
但是sql给了我一个错误:
sub-select返回2列-预期为1列

所以我放弃了谷歌搜索,因为我很困惑。救命啊


完整代码(如果需要):

def remove_item(self, username,item_name):
        conn = sqlite3.connect("database.db") 
        cursor = conn.cursor()
        #cursor.execute('DELETE FROM transactions WHERE username =:username AND item_name=:item_name LIMIT 1',{'username':username,'item_name':item_name})
        cursor.execute('''DELETE FROM transactions
                        WHERE username in 
                        (SELECT * FROM transactions WHERE username=:username AND item_name=:item_name LIMIT 1)
                        ''',{'username':username,'item_name':item_name})
        conn.commit()
        print(f'player.py >> Item {item_name} removed from {username}')
我是SQL和Python的新手,所以。。。不要杀我:D

将仅返回子查询中的一列用户名,但将删除子查询中具有提取用户名的所有行

你能做的是:-

cursor.execute('''DELETE FROM transactions
               WHERE rowid = 
               (SELECT rowid FROM transactions WHERE username=:username AND item_name=:item_name LIMIT 1)
               ''',{'username':username,'item_name':item_name})
但仅当未使用WITH ROWID子句定义表时

rowid是一个特殊的、通常隐藏的列,它唯一地标识一行,从而提取,并在WHERE子句中使用该列标识该特定行

请注意,理论上,与项目名称和用户名匹配的任何行都可以删除,但不一定是第一行。实际上,您应该使用ORDERBY子句来确保第一行是预期的行。但是,由于未指定顺序,上述内容可能会根据rowid工作,因为这将是使用的索引

由于没有有用的索引,您可以使用rowid作为顺序(rowid通常与插入顺序一致,即第一次插入的rowid为1,然后可能为2和3,依此类推)。因此,更正确的代码可能是:-

cursor.execute('''DELETE FROM transactions
               WHERE rowid = 
               (SELECT rowid FROM transactions WHERE username=:username AND item_name=:item_name ORDER BY rowid LIMIT 1)
               ''',{'username':username,'item_name':item_name})

是的,更新限制支持需要首先从原始源代码构建sqlite3.c合并的自定义版本,然后在启用特定选项的情况下编译该版本。在C或C++程序中使用该控件时,这是非常实用的。
cursor.execute('''DELETE FROM transactions
               WHERE rowid = 
               (SELECT rowid FROM transactions WHERE username=:username AND item_name=:item_name ORDER BY rowid LIMIT 1)
               ''',{'username':username,'item_name':item_name})