美文网首页
数据误删的补救方法

数据误删的补救方法

作者: manbug | 来源:发表于2018-01-16 14:28 被阅读0次

    BG:前一阵子在更新各城市地铁站数据表,每对一个新城市的地铁站做清洗时总免不了删除添加,有时状态不好,手一抖就可能删多了。比如上周五,要删除宁波的6,7号线地铁时忘了加city=nb的选项删除了所有城市的6,7号线。

    公司项目架构:

    1. 分线上与本地环境。
      (我误删的是本地环境的数据)
    2. 项目用django + postgresql

    补救方法:

    1. 备份线上的表,在本地恢复。

    简单粗暴。不过本地环境是新增了字段的,这样恢复完还需要补齐所有字段,不是很可取。

    2. 直接用django自带的ORM功能操作不同的数据库
    2.1 更改setting.py中的DATABASE配置
    DATABASES = {
            'default': {
                'ENGINE': 'django.contrib.gis.db.backends.postgis',
                'NAME': os.getenv('DATABASE_NAME', 'XXX'),
                'USER': os.getenv('DATABASE_USER', 'XXX'),
                'PASSWORD': 'XXX',
                'HOST': os.getenv('DATABASE_HOST', 'XXX'),
                'PORT': os.getenv('DATABASE_PORT', 'XXXX'),
                'ATOMIC_REQUESTS': True,
            },
            'ol_production': {
                'ENGINE': 'django.contrib.gis.db.backends.postgis',
                'NAME': os.getenv('DATABASE_NAME', 'XXX'),
                'USER': os.getenv('DATABASE_USER', 'XXX'),
                'PASSWORD': os.getenv('DATABASE_PASSWORD', 'XXX'),
                'HOST': os.getenv('DATABASE_HOST', 'XXX'),
                'PORT': os.getenv('DATABASE_PORT', 'XXX'),
                'ATOMIC_REQUESTS': True,
            }
        }
    
    2.2 正确使用Django的ORM
    objs_ori = models.objects.using("ol_production").filter(xxx)
    

    然后直接遍历,get_or_create
    正常来说这个应该是最快的方法了
    但是我们这个线上的列比本地的少,所以不能这么用

    2.3 结合sqlachemy
    from sqlalchemy import create_engine, text
    
    db_url = "postgresql+psycopg2://un:pw@ip/db_name"
    engine = create_engine(db_url)
    SQL = """SELECT * FROM poi_info_poirailwaystation WHERE address LIKE '%6号线%' AND city_id!=330200;"""
    # 好像是因为有中文,直接使用会报TypeError
    SQL = text(SQL)
    rows = engine.execute(SQL).fetchall()
    

    然后再遍历,新增。

    相关文章

      网友评论

          本文标题:数据误删的补救方法

          本文链接:https://www.haomeiwen.com/subject/hjysoxtx.html