V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Kcelone
V2EX  ›  Python

Python 解决, mysql 表数据去重及导入失败方案设计

  •  
  •   Kcelone · 2018-10-10 10:38:37 +08:00 · 2354 次点击
    这是一个创建于 1996 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天遇到个新需求,需要不定时将数据导入 MySQL 数据库。既然是数据导入,就会牵扯到数据重复导入和数据导入失败问题。 1.在解决数据重复导入问题上 方案 1:使用原生 sql,利用临时表进行去重后,数据合入原表。首先临时表重复数据去重:使用 select distinct, 然后在合入原表时再使用 insert into tablename(col1, col2, col3...) select col1, col2, col3... from template_tablename where not exists(select col1, col2, col3 from tablename where tablename.col1 = col1 and tablename.col2=col2 and tablename.col3=col3) 进行二次去重,即可达到去重效果。 方案 2:使用 sqlalchmy 方式去重,查询判断表中不存在当前条数据即插入,多条数据,则需要考虑分批插入。 2.数据导入数据库失败: 方案 1:在导入前进行数据规则校验,并在导入后进行查询,如果存在,则跳过,不存在就记录并尝试重新导入。

    10 条回复    2018-10-11 10:11:02 +08:00
    Kcelone
        1
    Kcelone  
    OP
       2018-10-10 10:43:46 +08:00
    如果有好的想法,欢迎留言,大家集思广益,多多提建议,一起搞个技术贴模块的讨论区间出来。鄙人建了个技术群欢迎加入,在这里一起搞事情。902788038
    kifile
        2
    kifile  
       2018-10-10 11:25:21 +08:00
    为什么不考虑唯一索引
    CharlieBrown
        3
    CharlieBrown  
       2018-10-10 13:36:18 +08:00
    将列设置为主键,拷贝表(忽略主键重复的)
    zjlletian
        4
    zjlletian  
       2018-10-10 14:20:06 +08:00
    直接在新表设置联合唯一约束,再往新表导入数据,成功的就是唯一的,后面有重复的就会导入失败。
    ccl945
        5
    ccl945  
       2018-10-10 14:37:57 +08:00
    数据量大建议入库后去重,数据量小入库时去重。
    Kcelone
        6
    Kcelone  
    OP
       2018-10-10 14:55:25 +08:00
    @kifile @zjlletian 可以使用唯一索引的,其实在刚开始的时候用的就是唯一索引,后面改成了 insert into select where...,然后又改成了 sqlalchemy 来操作,原因就是原生 sql 不易维护,且版本影响较大,比如关键字 ignore 在 5.7 之后就不再使用。
    Kcelone
        7
    Kcelone  
    OP
       2018-10-10 14:56:25 +08:00
    @CharlieBrown 不如唯一索引。
    Kcelone
        8
    Kcelone  
    OP
       2018-10-10 15:45:47 +08:00
    @ccl945 是因为数据量大易造成数据库假死吗?
    fortunezhang
        9
    fortunezhang  
       2018-10-10 16:03:48 +08:00
    看定时的频率和使用频率
    使用频率高:根据判断重复的字段加索引,然后自己写一个 findOrCreate 方法。每一条去执行这个方法。
    定时频率高:可以在使用的时候 select x from y order by id(created_at) desc ,这个就可以直接拿到你最近一次存入的值。
    可以再详细说一下使用场景,也许会有不同的方案。
    Kcelone
        10
    Kcelone  
    OP
       2018-10-11 10:11:02 +08:00
    @fortunezhang 使用场景就是 a,b,c 三个字段,每个字段都会有重复,但同时出现 a1,b1,c1 的情况只在数据库中存一次,加索引的话,要在 a,b,c 三个字段加联合唯一索引。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2024 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.