====== Création d'une relation (BDD) à partir d'un csv ====== Nous souhaitons implémenter une classe ''Relation'' qui permettra d'ouvrir un fichier ''.csv'' et de manipuler les données. ==== Attributs ==== == _columns == ''%%_columns%%'', un ''dict'' de forme ''%%{"name":type}%%'' Par exemple : ''%%{"idActeur": int, "name": str, "age": int}%%'' Cet attribut sera privé et fixé à la création de l'objet et ne pourra changer. Il permet d'indiquer les données attendues et leurs types. == _datas == ''%%_datas%%'', privé, de type ''%%list%%''. Chaque item dans la liste est un ''dict'' qui doit respecter le format de ''%%_columns%%''. Par exemple : ''%%{"idActeur": 12, "name": "Jean Rochefort", "age": 58}%%'' ''%%_datas%%'' étant privé, on ne pourra pas ajouter ou retirer des données n'importe comment. ==== Méthodes ==== == open_file == ''%%open_file(self, filename, separator)%%''. ''%%filename%%'' est le nom du fichier et ''%%separator%%'' est le séparateur de champs, par exemple '','' ou '';''. Précondition : le fichier existe, la première ligne contient l'entête avec les noms de colonnes, tous les noms de colonnes de ''%%_columns%%'' n'apparaissent, pas forcément dans le même ordre -- l'ordre n'est pas garanti dans un ''%%dict%%''. == is_empty == ''%%is_empty(self)%%'' qui renvoie ''%%True%%'' si l'objet ne contient aucune donnée. Ce type de méthode est appelée **prédicat**. == save_to_file == ''%%saveToFile(self, filename, separator)%%'' qui enregistre le contenu de l'objet dans un fichier. == pop == ''%%pop(self)%%'' qui extrait et retourne le dernier item de ''%%_datas%%''. Précondition : ''%%_datas%%'' n'est pas vide. == insert == ''%%insert(self, data_item)%%'' ou ''%%data_item%%'' est un ''dict'' comme ceux de ''%%_datas%%''. Est inseré à la suite de ''%%_datas%%''. Préconditions : ''%%data_item%%'' contient exactement les mêmes champs que ''%%_columns%%'' avec les bons types et l'item ajouté n'est pas un doublon d'un item déjà existant. == str == ''%%__str__(self)%%'' renvoie la ligne d'entête et les lignes de données comme elles apparaîtraient si on sauvegardait dans un fichier. == count == ''%%count(self)%%'' retournant la taille de ''%%_datas%%'' == select == ''%%select(column_name, value)%%'' renvoie un objet ''%%Relation%%'' dont les données sont constituées des lignes pour lesquelles la colonne de nom ''%%column_name%%''` a la valeur ''%%value%%''. == project == ''%%project(column_names)%%'' ou ''%%columnNames%%'' est un tuple précisant les noms de colonnes que l'on veut conserver. On obtient un objet ''Relation'' dont les données sont celles de l'objet de départ avec seulement les colonnes indiquées et sans doublons. Exemple : # L'objet maRelation contient : [ { "idFilm":1, "Réalisateur":"Joe Good", "Titre":"Cowboy in the town", "année":1937}, { "idFilm":2, "Réalisateur":"Luc Dupont", "Titre":"L'aventure", "année":1932}, { "idFilm":3, "Réalisateur":"Joe Good", "Titre":"Ok cowboy", "année":1938}, ] # maRelation.project(("Réalisateur", "année")) renvoie l'objet contenant : [ { "Réalisateur":"Joe Good", "année":1937}, { "Réalisateur":"Luc Dupont", "année":1932}, { "Réalisateur":"Joe Good", "année":1938}, ] # Il ne doit pas y avoir deux lignes identiques.