Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否删除sqlite中的重复行?_Python_Sqlite_Duplicates_Duplicate Removal - Fatal编程技术网

Python 是否删除sqlite中的重复行?

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

如何删除具有相同条目的条目? 我的桌面播放器有两个方面,一个是重复的。如何合并它们

我一直在寻找相关的问题。下面的代码基于我找到的答案。进程运行正常,但仍存在重复项。我希望没有重复的名字。如果多个名称有不同的wowp_id,我宁愿删除wowp_id,只保留一个名称条目

我在玩家中的行:

  (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 |