334 lines
11 KiB
Python
334 lines
11 KiB
Python
###############################################################################
|
|
#
|
|
# 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)
|
|
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_2 : str = random_element(pathWords)
|
|
|
|
return construct_line(idModele_1, idModele_2)
|
|
|
|
###############################################################################
|
|
#
|
|
# 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.
|
|
#
|
|
###############################################################################
|
|
|
|
# TODO
|
|
|
|
###############################################################################
|
|
#
|
|
# 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
|
|
}
|
|
|
|
###############################################################################
|
|
|
|
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(1000, 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)
|
|
|
|
|
|
###############################################################################
|
|
|