############################################################################### # # PYTHON SCRIPT TO RANDOMLY GENERATE DATA # STEPS : # 1 --> Generate a line of a table. # 2 --> Generate an entire table. # 3 --> Resolve the issues of dependencies and others. # 4 --> Convert the created tables to the PostgreSQL code. # Bonus --> Enjoy ! # ############################################################################### import random import csv ############################################################################### # # HERE IS ALL THE RAW DATA # # It is just csv files with for each a single column. # ############################################################################### pathIntegers : str = "data/row_numbers.csv" pathSentences : str = "data/sentences.csv" pathUrls : str = "data/urls.csv" pathWords : str = "data/words.csv" pathNames : str = "data/names.csv" pathNameModels : str = "data/name_models.csv" pathDates : str = "data/dates.csv" pathColors : str = "data/colors.csv" pathBrands : str = "data/brands.csv" ############################################################################### # # STEP 1 : GENERATE A LINE OF A TABLE # ############################################################################### def random_element(pathFile : str) -> str: """ :param pathFile: the relative path of the csv file to read. :return: a random element from this file. """ with open(pathFile, 'r') as file: csvList : list = list(csv.reader(file)) random_index_line : int = random.randint(1, len(csvList) - 1) return "" if ( csvList[random_index_line] == [] ) \ else csvList[random_index_line][0] ############################################################################### def construct_line(*args : tuple) -> str: """ :param *args: a tuple of elements. example : [ "1", "'toto'", "'Lorem PIPsum'", "42" ]. :return: a line to give to the sql. example : "(1, 'toto', 'Lorem PIPsum', 42)". """ return "(" + ', '.join(list(args)) + ")" ############################################################################### def generate_line_acheter() -> str: idMembre : str = random_element(pathIntegers) idPiece : str = random_element(pathIntegers) quantite : str = random_element(pathIntegers) return construct_line(idMembre, idPiece, quantite) def generate_line_avoir_motif() -> str: idPiece : str = random_element(pathIntegers) idMotif : str = random_element(pathIntegers) return construct_line(idPiece, idMotif) def generate_line_avoir_tag() -> str: idTag : str = random_element(pathIntegers) idBoite : str = random_element(pathIntegers) return construct_line(idTag, idBoite) def generate_line_boites() -> str: idBoite : str = random_element(pathIntegers) titre : str = "\'" + random_element(pathWords) + "\'" dateBoite : str = random_element(pathDates) idMarque : str = random_element(pathIntegers) return construct_line(idBoite, titre, dateBoite, idMarque) def generate_line_colorer() -> str: idPiece : str = random_element(pathIntegers) idCouleur : str = random_element(pathIntegers) return construct_line(idPiece, idCouleur) def generate_line_construire() -> str: idBoite : str = random_element(pathIntegers) idModele : str = random_element(pathIntegers) return construct_line(idBoite, idModele) def generate_line_contenir() -> str: idBoite : str = random_element(pathIntegers) idPiece : str = random_element(pathIntegers) quantite : str = random_element(pathIntegers) return construct_line(idBoite, idPiece, quantite) def generate_line_couleurs() -> str: idCouleur : str = random_element(pathIntegers) nomCouleur : str = "\'" + random_element(pathColors) + "\'" return construct_line(idCouleur, nomCouleur) def generate_line_enregistrer() -> str: idBoite : str = random_element(pathIntegers) idMembre : str = random_element(pathIntegers) quantite : str = random_element(pathIntegers) return construct_line(idBoite, idMembre, quantite) def generate_line_etre() -> str: idPiece : str = random_element(pathIntegers) idMarque : str = random_element(pathIntegers) return construct_line(idPiece, idMarque) def generate_line_etre_complexe() -> str: idPiece : str = random_element(pathIntegers) idPieceComp : str = random_element(pathIntegers) return construct_line(idPiece, idPieceComp) def generate_line_etre_forme() -> str: idForme : str = random_element(pathIntegers) idPiece : str = random_element(pathIntegers) return construct_line(idForme, idPiece) def generate_line_fils() -> str: idFil : str = random_element(pathIntegers) idModele : str = random_element(pathIntegers) return construct_line(idFil, idModele) def generate_line_illustrations() -> str: idIllustr : str = random_element(pathIntegers) urlIllustr : str = "\'" + random_element(pathUrls) + "\'" idModele : str = random_element(pathIntegers) return construct_line(idIllustr, urlIllustr, idModele) def generate_line_marques() -> str: idMarque : str = random_element(pathIntegers) nomMarque : str = "\'" + random_element(pathBrands) + "\'" return construct_line(idMarque, nomMarque) def generate_line_membres() -> str: idMembre : str = random_element(pathIntegers) nomMembre : str = "\'" + random_element(pathNames) + "\'" return construct_line(idMembre, nomMembre) def generate_line_messages() -> str: idMessages : str = random_element(pathIntegers) contenu : str = "\'" + random_element(pathSentences) + "\'" id_membre : str = random_element(pathIntegers) idFil : str = random_element(pathIntegers) idMessages2 : str = random_element(pathIntegers) return construct_line(idMessages, contenu, idFil, idMessages2) def generate_line_modeles() -> str: idModele : str = random_element(pathIntegers) nomModele : str = "\'" + random_element(pathNameModels) + "\'" urlNotice : str = "\'" + random_element(pathUrls) + "\'" idMembre : str = random_element(pathIntegers) idModeleEte : str = random_element(pathIntegers) return construct_line(idModele, nomModele, urlNotice, idMembre, \ idModeleEte) def generate_line_necessiter() -> str: idModele : str = random_element(pathIntegers) idPiece : str = random_element(pathIntegers) quantite : str = random_element(pathIntegers) return construct_line(idModele, idPiece, quantite) def generate_line_noter() -> str: idModele : str = random_element(pathIntegers) idMembre : str = random_element(pathIntegers) note : str = "\'" + random_element(pathSentences) + "\'" return construct_line(idModele, idMembre, note) def generate_line_perdre() -> str: idMembre : str = random_element(pathIntegers) idBoite : str = random_element(pathIntegers) idPiece : str = random_element(pathIntegers) quantite : str = random_element(pathIntegers) return construct_line(idMembre, idBoite, idPiece, quantite) def generate_line_tags() -> str: idTag : str = random_element(pathIntegers) nomTag : str = "\'" + random_element(pathWords) + "\'" return construct_line(idTag, nomTag) def generate_line_varier() -> str: idModele_1 : str = random_element(pathIntegers) idModele_et : str = random_element(pathIntegers) return construct_line(idModele_1, idModele_et) def generate_line_formes() -> str: idForme : str = random_element(pathIntegers) nomForme : str = "\'" + random_element(pathWords) + "\'" return construct_line(idForme, nomForme) def generate_line_motifs() -> str: idMotif : str = random_element(pathIntegers) nomMotif : str = "\'" + random_element(pathWords) + "\'" return construct_line(idMotif, nomMotif) def generate_line_pieces() -> str: idPiece : str = random_element(pathIntegers) return construct_line(idPiece) def generate_line_pieces_complexes() -> str: idPieceCo : str = random_element(pathIntegers) return construct_line(idPieceCo) ############################################################################### # # STEP 2 : GENERATE AN ENTIRE TABLE # # It is temporarily stored in a file with the extension .data # ############################################################################### def store_table(nbLines : int, pathFile : str, funcGenerationLine) -> None: """ :param nbLines: the number of generated lines we want to get. :param pathFile: the relative path where we want to store the table. :param funcGenerationLine: the function generate_line_* for the table. Write the table in a .data file. """ with open(pathFile, 'w+') as file: # w+ : if does not exist. for i in range(nbLines): file.write(funcGenerationLine() + ",\n") ############################################################################### # # STEP 3 : RESOLVE THE ISSUES OF DEPENDENCIES AND OTHERS # # Just edits the .data files. # ############################################################################### # Need to do it manually, otherwire it is too hard. # Step 1 : remove the duplicated primary keys, # if there are 2 objects with the same primary key. # Step 2 : remove the lines that have a foreign key that does not exist. ############################################################################### # # STEP 4 : CONVERSION TO PostgreSQL # ############################################################################### def convert_table_to_sql(pathFile : str, nameTable : str) -> None: """ :param pathFile: the relative path to the .data file which contains the table. :param nameTable: the name of the table. Write the code in append mode to the file called `insert.sql`. """ fileSql = open("insert.sql", 'a') # append mode. fileSql.write("INSERT INTO " + nameTable + " VALUES\n") with open(pathFile, 'r') as fileData: fileSql.writelines(fileData.readlines()) fileSql.close() # Replace last ',' by ';'. with open("insert.sql", 'rb+') as fileSql: fileSql.seek(-2, 2) fileSql.truncate() with open("insert.sql", 'a') as fileSql: fileSql.write(";\n") fileSql.write("\n") ############################################################################### dictTables : dict = { "acheter" : generate_line_acheter, "avoir_motif" : generate_line_avoir_motif, "avoir_tag" : generate_line_avoir_tag, "boites" : generate_line_boites, "colorer" : generate_line_colorer, "construire" : generate_line_construire, "contenir" : generate_line_contenir, "couleurs" : generate_line_couleurs, "enregistrer" : generate_line_enregistrer, "etre" : generate_line_etre, "etre_complexe" : generate_line_etre_complexe, "etre_forme" : generate_line_etre_forme, "fils" : generate_line_fils, "illustrations" : generate_line_illustrations, "marques" : generate_line_marques, "membres" : generate_line_membres, "messages" : generate_line_messages, "modeles" : generate_line_modeles, "necessiter" : generate_line_necessiter, "noter" : generate_line_noter, "perdre" : generate_line_perdre, "tags" : generate_line_tags, "varier" : generate_line_varier, "formes" : generate_line_formes, "motifs" : generate_line_motifs, "pieces" : generate_line_pieces, "pieces_complexes" : generate_line_pieces_complexes } ############################################################################### def givePathFile(nameTable : str) -> str: repertory : str = "build/" return repertory + nameTable + ".data" ############################################################################### if __name__ == '__main__': # Uncomment if you want to generate data. for nameTable in dictTables: store_table(200, givePathFile(nameTable), dictTables[nameTable]) fileSql = open("insert.sql", 'w+') fileSql.write("TRUNCATE " + ', '.join(dictTables) + ";\n") fileSql.write("\n") fileSql.close() with open("insert.sql", 'a') as fileSql: for nameTable in dictTables: convert_table_to_sql(givePathFile(nameTable), nameTable) ###############################################################################