1
0
Fork 0
mirror of https://github.com/yweber/lodel2.git synced 2026-05-02 13:10:58 +02:00

Refactoring comments in db wrapper

This commit is contained in:
Yann 2015-05-27 13:31:35 +02:00
commit 07209417a7
3 changed files with 85 additions and 131 deletions

View file

@ -13,13 +13,10 @@ class SqlWrapper(object):
self.write_engine = self.get_engine(sqlsettings.DB_WRITE_CONNECTION_NAME)
def get_engine(self, connection_name):
"""Crée un moteur logique sur une base de données
""" Crée un moteur logique sur une base de données
Args:
connection_name (str): Nom de la connexion telle que définie dans les settings django
Returns:
Engine.
@param connection_name str: Connection name as defined is django settings
@return Engine
"""
connection_params = settings.DATABASES[connection_name]
@ -49,14 +46,11 @@ class SqlWrapper(object):
return self.write_engine
def execute(self, queries, action_type):
"""Exécute une série de requêtes en base
""" Exécute une série de requêtes en base
Args:
queries (list): une liste de requêtes
action_type (str): le type d'action ('read'|'write')
Returns:
List. Tableau de résultats sous forme de tuples (requête, résultat)
@param queries list: une liste de requêtes
@param action_type str: le type d'action ( 'read'|'write' )
@return List. Tableau de résultats sous forme de tuples (requête, résultat)
"""
db = self.get_write_engine() if action_type==sqlsettings.ACTION_TYPE_WRITE else self.get_read_engine()
@ -81,12 +75,11 @@ class SqlWrapper(object):
return result
def create_foreign_key_constraint_object(self, localcol, remotecol, constraint_name=None):
"""Génère une contrainte Clé étrangère
""" Génère une contrainte Clé étrangère
Args:
localcol (str) : Colonne locale
remotecol (str) : Colonne distante (syntaxe : Table.col)
constraint_name (str) : Nom de la contrainte (par défaut : fk_localcol_remotecol)
@param localcol str: Colonne locale
@param remotecol str: Colonne distante (syntaxe : Table.col)
@param constraint_name str: Nom de la contrainte (par défaut : fk_localcol_remotecol)
Returns:
ForeignKeyConstraint.
@ -96,22 +89,15 @@ class SqlWrapper(object):
return foreignkeyobj
def create_column_object(self, column_name, column_type, column_extra=None):
"""Génère un objet colonne
""" Génère un objet colonne
Args:
column_name (str): Nom de la colonne
column_name (str): Type de la colonne
column_extra (objet) : Objet json contenant les paramètres optionnels comme PRIMARY KEY, NOT NULL, etc ...
Exemple de dictionnaire pour column_extra : { "primarykey":True, "nullable":False, "default":"test" ... }
@param column_name str: Nom de la colonne
@param column_type str: Type de la colonne
@param column_extra dict : Objet json contenant les paramètres optionnels comme PRIMARY KEY, NOT NULL, etc ...
Returns:
Column. La méthode renvoie "None" si l'opération échoue
@return Column. La méthode renvoie "None" si l'opération échoue
Ex d'objet json "extra" :
{
"primarykey":True,
"nullable":False,
"default":"test" ...
}
"""
# Traitement du type (mapping avec les types SQLAlchemy)
@ -144,29 +130,19 @@ class SqlWrapper(object):
return column
def create_table(self, tableparams):
"""Crée une nouvelle table
Args:
tableparams (object): Objet Json contenant les paramétrages de la table
""" Crée une nouvelle table
Returns:
bool. True si le process est allé au bout, False si on a rencontré une erreur.
Les paramètres de la tables sont passés via un dictionnaire dont voici la description :
{ 'name':'<nom_table>', 'columns': [ <col1>, <col2>, <coln> ], 'constraints': dict(...) }
Avec <colX> : { 'name': '<name_colX>', 'type': '<type_colX>', 'extra': dict(...) }
A noter que les types de col (<type_colX>) sont des chaines representant un type SQL (ex: "VARCHAR(50)")
Les deux champs "name" et "columns" seulement sont obligatoires.
Le champ "extra" de la définition des colonnes est facultatif.
Le json de paramètres de table est construit suivant le modèle :
{
'name':'<nom de la table>',
'columns':[
{
'name':"<nom de la colonne 1>",
'type':"<type de la colonne 1, ex: VARCHAR(50)>",
'extra': "indications supplémentaires sous forme d'objet JSON"
}
],
'constraints':{},
...
}
@args tableparams dict: Dictionnaire avec les paramétrages de la table
@return bool. True si le process est allé au bout, False si on a rencontré une erreur.
Les deux champs "name" et "columns" seulement sont obligatoires.
Le champ "extra" de la définition des colonnes est facultatif.
"""
metadata = MetaData()
@ -185,13 +161,11 @@ class SqlWrapper(object):
def get_table(self, table_name, action_type=sqlsettings.ACTION_TYPE_WRITE):
"""Récupère une table dans un objet Table
Args:
table_name (str): Nom de la table
action_type (str): Type d'action (read|write) (par défaut : "write")
Returns:
Table.
""" Récupère une table dans un objet Table
@param table_name str: Nom de la table
@param action_type str: Type d'action (read|write) (par défaut : "write")
@return Table.
"""
db = self.get_write_engine() if action_type == sqlsettings.ACTION_TYPE_WRITE else self.get_read_engine()
metadata = MetaData()
@ -200,13 +174,9 @@ class SqlWrapper(object):
def drop_table(self, table_name):
"""Supprime une table
Args:
table_name (str): Nom de la table
Returns:
bool. True si le process est allé au bout. False si on a rencontré une erreur
""" Supprime une table
@param table_name str: Nom de la table
@return bool. True si le process est allé au bout. False si on a rencontré une erreur
"""
try:
@ -228,14 +198,12 @@ class SqlWrapper(object):
return querystring
def add_column(self, table_name, column):
"""Ajoute une colonne à une table existante
""" Ajoute une colonne à une table existante
Args:
table_name (str): nom de la table
column (object): colonne à rajouter sous forme d'objet python - {"name":"<nom de la colonne>", "type":"<type de la colonne>"}
@param table_name str: nom de la table
@param column dict: la colonne - {"name":"<nom de la colonne>", "type":"<type de la colonne>"}
Returns:
bool. True si le process est allé au bout, False si on a rencontré une erreur
@return bool. True si le process est allé au bout, False si on a rencontré une erreur
"""
sqlquery = self.get_querystring('add_column', self.get_write_engine().dialect) % (table_name, column['name'], column['type'])
@ -243,14 +211,12 @@ class SqlWrapper(object):
return True if sqlresult else False
def alter_column(self, table_name, column):
"""Modifie le type d'une colonne
""" Modifie le type d'une colonne
Args:
table_name (str): nom de la table
column_name (object): colonne passée sous forme d'objet python - {"name":"<nom de la colonne>","type":"<nouveau type de la colonne>"}
@param table_name str: nom de la table
@param column_name dict: la colonne - {"name":"<nom de la colonne>","type":"<nouveau type de la colonne>"}
Returns:
bool. True si le process est allé au bout. False si on a rencontré une erreur
@return bool. True si le process est allé au bout. False si on a rencontré une erreur
"""
sqlquery = self.get_querystring('alter_column', self.get_write_engine().dialect) % (table_name, column['name'], column['type'])
@ -258,27 +224,23 @@ class SqlWrapper(object):
return True if sqlresult else False
def insert(self, table_name, newrecord):
"""Insère un nouvel enregistrement
""" Insère un nouvel enregistrement
Args:
table_name (str): nom de la table
newrecord (dict): objet python contenant le nouvel enregistrement à insérer - {"column1":"value1", "column2":"value2", etc ...)
@param table_name str: nom de la table
@param newrecord dict: dictionnaire contenant les informations sur le nouvel enregistrement à insérer - {"column1":"value1", "column2":"value2", etc ...)
Returns:
int. Nombre de lignes insérées
@return int. Nombre de lignes insérées
"""
sqlresult = self.execute(self.get_table(table_name).insert().values(newrecord), sqlsettings.ACTION_TYPE_WRITE)
return sqlresult.rowcount
def delete(self, table_name, whereclauses):
"""Supprime un enregistrement
""" Supprime un enregistrement
Args:
table_name (str): nom de la table
whereclauses (list): liste des conditions sur les enregistrements (sous forme de textes SQL)
@param table_name str: nom de la table
@param whereclauses list: liste des conditions sur les enregistrements (sous forme de textes SQL)
Returns:
int. Nombre de lignes supprimées
@return int. Nombre de lignes supprimées
"""
deleteobject = self.get_table(table_name).delete()
@ -290,18 +252,15 @@ class SqlWrapper(object):
return sqlresult.rowcount
def update(self, table_name, whereclauses, newvalues):
"""Met à jour des enregistrements
""" Met à jour des enregistrements
Args:
table_name (str): nom de la table
whereclauses (list): liste des conditions sur les enregistrements (sous forme de textes SQL)
newvalues (dict): objet python contenant les nouvelles valeurs à insérer - {"colonne1":"valeur1", "colonne2":"valeur2", etc ...}
@param table_name str: nom de la table
@param whereclauses list: liste des conditions sur les enregistrements (sous forme de textes SQL)
@param newvalues dict: dictionnaire contenant les nouvelles valeurs à insérer - {"colonne1":"valeur1", "colonne2":"valeur2", etc ...}
Returns:
int. Nombre de lignes modifiées
@return int. Nombre de lignes modifiées
Raises:
DataError. Incompatibilité entre la valeur insérée et le type de colonne dans la table
@throw DataError. Incompatibilité entre la valeur insérée et le type de colonne dans la table
"""
table = self.get_table(table_name)
@ -325,25 +284,23 @@ class SqlWrapper(object):
return updated_lines_count
def select(self, select_params):
"""Récupère un jeu d'enregistrements
""" Récupère un jeu d'enregistrements
Args:
select_params (list): liste d'objets permettant de caractériser la requête.
{
"what":"<liste des colonnes>",
"from":"<liste des tables>",
"where":"<liste des conditions>",
"distinct":True|False,
"join":{"left":"table_de_gauche.champ","right":"table_de_droite.champ", "options":{"outer":True|False}}
...
}
Champs de select_params :
- "what":"<liste des colonnes>",
- "from":"<liste des tables>",
- "where":"<liste des conditions>",
- "distinct":True|False,
- "join":{"left":"table_de_gauche.champ","right":"table_de_droite.champ", "options":{"outer":True|False}}
- ...
Les listes sont supportées sous deux formats :
- texte SQL : "colonne1, colonne2, ..."
- liste Python : ["colonne1", "colonne2", ...]
Les listes sont supportées sous deux formats :
- texte SQL : "colonne1, colonne2, ..."
- liste Python : ["colonne1", "colonne2", ...]
Returns:
list. Liste des dictionnaires représentant les différents enregistrements.
@param select_params list: liste de dictionnaire permettant de caractériser la requête.
@return list. Liste des dictionnaires représentant les différents enregistrements.
"""
if not 'what' in select_params or not 'from' in select_params:
@ -431,22 +388,18 @@ class SqlWrapper(object):
def create_join_object(self, join_params):
"""Génère un objet "Jointure" pour le greffer dans une requête
Args:
join_params (dict) : dictionnaire de données sur la jointure.
On peut avoir les deux formats suivants :
{
"left":"table.champ",
"right":"table.champ",
"options":{"outer":True|False}
}
ou
{
"left":{"table":"nom de la table","field":"nom du champ"},
"right":{"table":"nom de la table","field":"nom du champ"},
"options":{"outer":True|False}
}
Returns:
join.
Format des dictionnaires de description des jointures :
- Format1 liste de champs
- "left":"table.champ",
- "right":"table.champ",
- "options":{"outer":True|False}
- Format2 liste de champs
- "left":{"table":"nom de la table","field":"nom du champ"},
- "right":{"table":"nom de la table","field":"nom du champ"},
- "options":{"outer":True|False}
@param join_params (dict) : dictionnaire de données sur la jointure.
@return join.
"""
join_object = None