import sys,json from pathlib import Path from datetime import datetime sys.stdout.reconfigure(encoding='utf-8') ROOT=Path(__file__).resolve().parent sys.path.insert(0,str(ROOT.parent/'iqc-import-20261012/deps')) import pymysql manifest=json.loads((ROOT/'backlog-inserted-ids.json').read_text(encoding='utf-8')) ids=[r['follow_id'] for r in manifest['records']] assert len(ids)==1773 and len(set(ids))==len(ids) args=dict(host='36.213.150.237',port=10000,user='root',password=sys.stdin.readline().strip(),database='mom-hm',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor,autocommit=False,connect_timeout=15,read_timeout=60) conn=pymysql.connect(**args) try: with conn.cursor() as q: q.execute('SELECT DATABASE() db,NOW() now');state=q.fetchone();assert state['db']=='mom-hm' clause=','.join(['%s']*len(ids)) q.execute('SELECT * FROM crm_follow_up_record WHERE id IN ('+clause+') ORDER BY id FOR UPDATE',ids) before=q.fetchall();assert len(before)==len(ids) for r in before: assert r['creator']=='0' and r['type']==5 assert all(r[field] in ('[]','') for field in ('business_ids','contact_ids','pic_urls')) backup=ROOT/('followup-list-repair-backup-'+state['now'].strftime('%Y%m%d-%H%M%S')+'.json') backup.write_text(json.dumps(before,ensure_ascii=False,indent=2,default=str),encoding='utf-8') q.execute("UPDATE crm_follow_up_record SET business_ids=CASE WHEN business_ids='[]' THEN '' ELSE business_ids END, contact_ids=CASE WHEN contact_ids='[]' THEN '' ELSE contact_ids END, pic_urls=CASE WHEN pic_urls='[]' THEN '' ELSE pic_urls END, update_time=update_time WHERE id IN ("+clause+") AND (business_ids='[]' OR contact_ids='[]' OR pic_urls='[]')",ids) changed=q.rowcount q.execute('SELECT * FROM crm_follow_up_record WHERE id IN ('+clause+') ORDER BY id',ids) after=q.fetchall() for old,current in zip(before,after): assert all(current[k]==v for k,v in old.items() if k not in ('business_ids','contact_ids','pic_urls')) assert all(current[field]=='' for field in ('business_ids','contact_ids','pic_urls')) q.execute('SELECT COUNT(*) count FROM system_operate_log WHERE trace_id=%s',(manifest['batch'],));assert q.fetchone()['count']==1773 conn.commit() with pymysql.connect(**args) as verify: with verify.cursor() as q: q.execute('SELECT * FROM crm_follow_up_record WHERE id IN ('+clause+') ORDER BY id',ids) assert q.fetchall()==after result=dict(database='mom-hm',repaired_records=changed,records_verified=len(after),committed=True,verified_after_commit=True,backup=str(backup)) (ROOT/'followup-list-repair-result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8') print(json.dumps(result,ensure_ascii=False)) except Exception: conn.rollback();raise finally:conn.close()