BG:前一阵子在更新各城市地铁站数据表,每对一个新城市的地铁站做清洗时总免不了删除添加,有时状态不好,手一抖就可能删多了。比如上周五,要删除宁波的6,7号线地铁时忘了加city=nb的选项删除了所有城市的6,7号线。
公司项目架构:
- 分线上与本地环境。
(我误删的是本地环境的数据)- 项目用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()
然后再遍历,新增。
网友评论