项目代码提交
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
"""纠正已知初始日期为先开放、后发Offer;备份、事务更新,可重复执行。"""
|
||||
import ast
|
||||
import json
|
||||
import sys
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT))
|
||||
from sqlalchemy import text
|
||||
from database import engine
|
||||
|
||||
|
||||
def main():
|
||||
tree = ast.parse((ROOT / "seed_data.py").read_text(encoding="utf-8-sig"))
|
||||
constants = {node.targets[0].id: ast.literal_eval(node.value)
|
||||
for node in tree.body if isinstance(node, ast.Assign)
|
||||
and isinstance(node.targets[0], ast.Name)
|
||||
and node.targets[0].id in ("employment_data", "student_data")}
|
||||
seeds = {str(constants["student_data"][row["student_id"]-1]["student_no"]): row
|
||||
for row in constants["employment_data"]}
|
||||
snapshot = "SELECT e.*, s.student_no FROM employment e JOIN student s ON s.sid=e.student_id ORDER BY e.id"
|
||||
with engine.begin() as conn:
|
||||
before = [dict(row._mapping) for row in conn.execute(text(snapshot + " FOR UPDATE"))]
|
||||
backup = ROOT / "artifacts" / ("employment-before-offer-order-" + datetime.now().strftime("%Y%m%d-%H%M%S-%f") + ".json")
|
||||
backup.parent.mkdir(exist_ok=True)
|
||||
backup.write_text(json.dumps({"database": conn.execute(text("SELECT DATABASE()")).scalar(), "rows": before}, ensure_ascii=False, indent=2, default=str), encoding="utf-8")
|
||||
changed, skipped = [], []
|
||||
for old in before:
|
||||
seed = seeds.get(old['student_no'])
|
||||
if not seed:
|
||||
continue
|
||||
start = datetime.fromisoformat(seed['employment_start_time'])
|
||||
offer = datetime.fromisoformat(seed['offer_time'])
|
||||
assert offer >= start
|
||||
if (old['employment_start_time'], old['offer_time']) == (start, offer):
|
||||
continue
|
||||
# 只改完全匹配的旧种子日期,保留用户已编辑的记录。
|
||||
if old['company_name'] != seed['company_name'] or (old['employment_start_time'], old['offer_time']) != (offer, start):
|
||||
skipped.append(old['id'])
|
||||
continue
|
||||
conn.execute(text("UPDATE employment SET employment_start_time=:start, offer_time=:offer WHERE id=:id"), {'start':start,'offer':offer,'id':old['id']})
|
||||
changed.append(old['id'])
|
||||
after = [dict(row._mapping) for row in conn.execute(text(snapshot))]
|
||||
assert len(before) == len(after)
|
||||
for old, new in zip(before, after):
|
||||
assert old['id'] == new['id']
|
||||
if old['id'] not in changed:
|
||||
assert old == new
|
||||
else:
|
||||
assert new['offer_time'] >= new['employment_start_time']
|
||||
assert all(old[key] == new[key] for key in old if key not in ('employment_start_time','offer_time'))
|
||||
print('Backup:', backup)
|
||||
print('Updated initial record IDs:', changed)
|
||||
print('Skipped customized initial record IDs:', skipped)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user