From e29240f274a3c41828e24c611ec6602daaa2a06f Mon Sep 17 00:00:00 2001 From: Eunhak Lee <lee@enak.kr> Date: Sun, 8 Dec 2024 20:52:44 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=20parts=20=EB=93=A4?= =?UTF-8?q?=EC=9D=B4=20=EB=93=B1=EB=A1=9D=EB=8F=BC=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=A1=B0=ED=95=A9=EC=9D=84=20=EC=9E=AC?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=20=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- push_to_db.py | 53 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/push_to_db.py b/push_to_db.py index 31a5433..a7e68e4 100644 --- a/push_to_db.py +++ b/push_to_db.py @@ -73,6 +73,20 @@ RETURNING part_id;""".format(type=_part_type_enum, columns=columns, value_entrie return None +def check_if_parts_exist(_cursor, _user_id, _part_ids): + sql = """WITH result AS (SELECT combinations.id AS combination_id, +ARRAY(SELECT part_id FROM relations WHERE relations.combination_id = combinations.id ORDER BY relations.part_id) AS parts +FROM combinations WHERE combinations.owner_id = %s) SELECT combination_id FROM result WHERE parts = %s;""" + _cursor.execute(sql, (_user_id, _part_ids)) + data = _cursor.fetchall() + + if not data: + return None + + _existing_combination_id = data[-1][-1] + return _existing_combination_id + + def create_combination(_cursor, nickname, _user_id): _pc_name = "새 PC" if nickname: @@ -140,6 +154,7 @@ def func(): _parts = parse.handle_xml_body(_xml_document) _part_ids = [] + _created_parts = False print("Matching parts") @@ -157,6 +172,7 @@ def func(): _matched_id = match_part_obj_into_db(part, part_type) if not _matched_id: # DB에 없는 부품이라면 + _created_parts = True print(".. creating new part with", part["name"]) with db_conn.cursor() as cursor: _matched_id = create_new_one(part, part_type, cursor) @@ -167,21 +183,34 @@ def func(): continue print(f"[WARNING] failed to match part type={part_type}, part:", part, file=sys.stderr) - - print("Creating combination") - with db_conn.cursor() as cursor: - _combination_id = create_combination(cursor, None, _user_id) - if not _combination_id: - print("Failed to create combination", file=sys.stderr) - exit(1) - print("Wiring parts", _part_ids, "to combination id", _combination_id) - with db_conn.cursor() as cursor: - wire_part_to_combination(cursor, _combination_id, *_part_ids) + _combination_id = None + # 이미 존재하는 경우 + if not _created_parts: + print("Checking combination existance") + with db_conn.cursor() as cursor: + _combination_id = check_if_parts_exist(cursor, _user_id, _part_ids) - print("Committing to DB") - db_conn.commit() + if _combination_id is not None: + print("Combination exist. Using combination id", _combination_id) + + # 새로 추가하는 경우 + if _combination_id is not None: + print("Creating combination") + with db_conn.cursor() as cursor: + _combination_id = create_combination(cursor, None, _user_id) + + if not _combination_id: + print("Failed to create combination", file=sys.stderr) + exit(1) + + print("Wiring parts", _part_ids, "to combination id", _combination_id) + with db_conn.cursor() as cursor: + wire_part_to_combination(cursor, _combination_id, *_part_ids) + + print("Committing to DB") + db_conn.commit() print("Finalizing transaction") with db_conn.cursor() as cursor: -- GitLab