def delete_object(query_info: Dict[str, str], session: scoped_session, collection: bool = False) -> None: """ Delete the object from the database :param query_info: Dict containing the id and @type of object that has to retrieved :param session: sqlalchemy session :param collection: True if the type_ is of a collection, False for any other class """ type_ = query_info["@type"] id_ = query_info["id_"] database_class = get_database_class(type_) if collection: try: objects = session.query(database_class).filter_by( collection_id=id_).delete() except NoResultFound: raise InstanceNotFound(type_=type_, id_=id_) try: session.commit() except InvalidRequestError: session.rollback() return id_ else: try: object_ = (session.query(database_class).filter( database_class.id == id_).one()) except NoResultFound: raise InstanceNotFound(type_=type_, id_=id_) session.delete(object_) try: session.commit() except InvalidRequestError: session.rollback()
def insert_object(object_: Dict[str, Any], session: scoped_session, collection: bool = False) -> str: """ Insert the object in the database :param object_: Dict containing object properties :param session: sqlalchemy session :return: The ID of the inserted object """ type_ = get_type(object_) database_class = get_database_class(type_) id_ = object_.get("id", None) if collection: # if type_ is of a collection class members = object_['members'] collection_id = id_ if id_ else str(uuid.uuid4()) for member in members: # add all the members of that collection inserted_object = database_class( members=member['id_'], collection_id=collection_id, member_type=member['@type'], ) try: session.add(inserted_object) session.commit() except InvalidRequestError: session.rollback() return collection_id else: # when type_ is of a non-collection class if (id_ is not None and session.query( exists().where(database_class.id == id_)).scalar()): raise InstanceExists(type_, id_) foreign_keys = database_class.__table__.foreign_keys for fk in foreign_keys: # the name of the column through which this foreign key relationship # is being established fk_column = fk.info["column_name"] try: fk_object = object_[fk_column] except KeyError as e: wrong_property = e.args[0] raise PropertyNotGiven(type_=wrong_property) # insert the foreign key object fk_object_id = insert_object(fk_object, session) # put the id of the foreign instance in this table's column object_[fk_column] = fk_object_id try: # remove the @type from object before using the object to make a # instance of it using sqlalchemy class object_.pop("@type") inserted_object = database_class(**object_) except TypeError as e: # extract the wrong property name from TypeError object wrong_property = e.args[0].split("'")[1] raise PropertyNotFound(type_=wrong_property) try: session.add(inserted_object) session.commit() except InvalidRequestError: session.rollback() return inserted_object.id