Python 是否删除sqlite中的重复行?
如何删除具有相同条目的条目? 我的桌面播放器有两个方面,一个是重复的。如何合并它们 我一直在寻找相关的问题。下面的代码基于我找到的答案。进程运行正常,但仍存在重复项。我希望没有重复的名字。如果多个名称有不同的wowp_id,我宁愿删除wowp_id,只保留一个名称条目 我在玩家中的行:Python 是否删除sqlite中的重复行?,python,sqlite,duplicates,duplicate-removal,Python,Sqlite,Duplicates,Duplicate Removal,如何删除具有相同条目的条目? 我的桌面播放器有两个方面,一个是重复的。如何合并它们 我一直在寻找相关的问题。下面的代码基于我找到的答案。进程运行正常,但仍存在重复项。我希望没有重复的名字。如果多个名称有不同的wowp_id,我宁愿删除wowp_id,只保留一个名称条目 我在玩家中的行: (id, wowp_id, name, team) (108, 501078041, u'prazluges', None) (109, 507894244, u'Aidis', None) (110, 50
(id, wowp_id, name, team)
(108, 501078041, u'prazluges', None)
(109, 507894244, u'Aidis', None)
(110, 500742127, u'Aidis', None)
(111, u'Aidis', u'Aidis', None)
(112, u'Aidis', u'Aidis', None)
(113, 500864543, u'prazluges', None)
(114, u'Aidis', u'Aidis', None)
(115, u'Aidis', u'Aidis', None)
(116, u'Aidis', u'Aidis', None)
(117, 501078041, u'satih', None)
(118, u'Aidis', u'Aidis', None)
使用定义的contains方法将结果导入自定义类的一个实例中,以保留所需内容。示例如下:
class players:
def __contains__(self, item):
return self.playersObj.name != item.name
# Your other methods go here
然后将您的行导入到播放器实例中,并将其写回 您可以在列上定义唯一索引,或使用索引列在表上定义唯一约束
这些有助于防止重复发生。链接指向SQLite文档。听起来像是您试图删除相同名称的重复WOWP\u ID。我假设您为每个名称保留了最大的WOWP_ID。如果表中有一个可靠的唯一键,例如主键,那么答案很简单。如果您没有这样的钥匙,可以尝试以下方法:
import unittest
import sqlite3
class DaoTest(unittest.TestCase):
def testDeleteDuplicates(self):
with sqlite3.connect("WOWT.sql") as conn:
rowsToDelete = conn.execute('''
SELECT PLAYERS.NAME, PLAYERS.TEAM, PLAYERS.WOWP_ID FROM PLAYERS INNER JOIN
(
SELECT PLAYERS.NAME, MAX(WOWP_ID) AS MAX_ID FROM PLAYERS INNER JOIN
(
SELECT NAME, COUNT(DISTINCT WOWP_ID) AS DUP FROM PLAYERS
GROUP BY NAME
HAVING DUP > 1
) DUPTABLE
ON PLAYERS.NAME = DUPTABLE.NAME
GROUP BY PLAYERS.NAME
) RowsToKeep
ON PLAYERS.NAME = RowsToKeep.NAME AND PLAYERS.WOWP_ID <> MAX_ID
''')
conn.executemany("DELETE FROM PLAYERS WHERE NAME = ? AND TEAM = ? AND WOWP_ID = ?", rowsToDelete)
你能行
从玩家中删除
我不在哪里
选择MINid id
来自玩家
按wowp_id、名称分组
;
注意:在继续删除之前,请确保您的数据有可靠的备份
从表中删除重复项后,请确保创建唯一约束
在playerswowp\u id,name上创建唯一索引idx\u wowp\u id\u name;
重复数据消除后的结果:
| id | wowp_id | name | team |
|-----|-----------|-----------|------|
| 108 | 501078041 | prazluges | None |
| 109 | 507894244 | Aidis | None |
| 110 | 500742127 | Aidis | None |
| 111 | Aidis | Aidis | None |
| 113 | 500864543 | prazluges | None |
| 117 | 501078041 | satih | None |
下面是演示唯一约束的作用是什么?为什么我需要它?这个建议似乎比其他建议要复杂一些。但是谢谢。另外请注意,sqlite3有一个隐藏的ROWID列,您可以使用它删除重复的行,请参见以下答案: | id | wowp_id | name | team | |-----|-----------|-----------|------| | 108 | 501078041 | prazluges | None | | 109 | 507894244 | Aidis | None | | 110 | 500742127 | Aidis | None | | 111 | Aidis | Aidis | None | | 113 | 500864543 | prazluges | None | | 117 | 501078041 | satih | None |