X-Git-Url: https://plomlompom.com/repos/todo?a=blobdiff_plain;f=plomtask%2Fdb.py;h=34b5887c0204532ea6a32ade0eed6ccea92fbbaa;hb=704c00a101fc1922158a3a71a043562d34b696ad;hp=deeb748de0b427b1ff2f999e58713d3cee4e7807;hpb=c6ad5c1fe2811225648a1d1c74c667ed38b7671e;p=plomtask diff --git a/plomtask/db.py b/plomtask/db.py index deeb748..34b5887 100644 --- a/plomtask/db.py +++ b/plomtask/db.py @@ -223,16 +223,34 @@ class BaseModel(Generic[BaseModelId]): items[item.id_] = item return list(items.values()) - def save_core(self, db_conn: DatabaseConnection, - update_with_lastrowid: bool = True) -> None: - """Write bare-bones self (sans connected items), ensuring self.id_.""" + def __eq__(self, other: object) -> bool: + if not isinstance(other, self.__class__): + msg = 'cannot compare to object of different class' + raise HandledException(msg) + to_hash_me = tuple([self.id_] + + [getattr(self, name) for name in self.to_save]) + to_hash_other = tuple([other.id_] + + [getattr(other, name) for name in other.to_save]) + return hash(to_hash_me) == hash(to_hash_other) + + def save_core(self, db_conn: DatabaseConnection) -> None: + """Write bare-bones self (sans connected items), ensuring self.id_. + + Write both to DB, and to cache. To DB, write .id_ and attributes + listed in cls.to_save. + + Ensure self.id_ by setting it to what the DB command returns as the + last saved row's ID (cursor.lastrowid), EXCEPT if self.id_ already + exists as a 'str', which implies we do our own ID creation (so far + only the case with the Day class, where it's to be a date string. + """ values = tuple([self.id_] + [getattr(self, key) for key in self.to_save]) q_marks = DatabaseConnection.q_marks_from_values(values) table_name = self.table_name cursor = db_conn.exec(f'REPLACE INTO {table_name} VALUES {q_marks}', values) - if update_with_lastrowid: + if not isinstance(self.id_, str): self.id_ = cursor.lastrowid # type: ignore[assignment] self.cache()