Bonjour à tous.
Je suis actuellement en train de développer un jeu en ligne textuel en me basant sur un projet open-source codé en Python (version 3.x). Le projet est dans un état avancé et comprend de nombreuses classes et un code source assez conséquent.
Actuellement, les données de l'univers (les infos des joueurs, des bots, des objets, etc.) sont stockés à l'aide de Pickle. Une simple boucle parcourt tous les objets du jeu stockés en mémoire et les sauvegarde dans un fichier. Le chargement, quant à lui, consiste simplement à dépickler tous les objets du fichier. Cette méthode est simple mais nous posera, sur le long terme, des problèmes de performance et complique la consultation et l'analyse des données.
Par conséquent, j'aimerais changer de système et partir sur une base de données relationnelle. Je dois avouer que j'ai du mal à me projeter dans la tâche et que la conversion me parait complexe. C'est pourquoi je vous consulte aujourd'hui en quête de conseils.
Voici un exemple particulier basé sur trois classes.
Une classe "PNJ" hérite d'une classe "Personnage".
Une classe "Joueur" hérite d'une classe "Personnage."
Voici un code très simplifié des trois classes. J'ai bien entendu enlevé la grande majorité des attributs ainsi que l'intégralité des méthodes. C'est juste pour l'exemple.
La classe "Personnage" :
La classe "Joueur" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class Personnage(Base_objet): def __init__(self): Base_objet.__init__(self) self.nom = "" self.salle = None self.stats = Stats(self) self.race = None self.sorts = {}
La classe "Personnage" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Joueur(Personnage): def __init__(self): Personnage.__init__(self) self.compte = None self.niveau = 1 self.classe = None
Personnage contient plusieurs instances d'autres classes. Exemple : la race qui y est stockée est un objet issu de la classe "Race". Le dictionnaire "sorts" contient également des objets "Sort". La classe joueur comporte un objet "Classe" et un objet "Compte". Quant à la classe "PNJ", elle comporte un objet "Prototype" ainsi qu'un objet "Salle".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class PNJ(Personnage): def __init__(self, prototype, salle=None): Personnage.__init__(self) self._nom = "" self.prototype = prototype self.salle = salle
Je vois deux méthodes possibles pour stocker toutes ces infos dans une base de données.
Méthode 1 : utilisation de requêtes SQL brutes
J'ajoute des méthodes "save" et "load" à chacune des classes du projet. Ces méthodes se chargent de faire des requêtes SQL pour récupérer les infos de la base et les mettre à jour tout au long de l’exécution du programme. Le problème, c'est que j'ai peur de la complexité d'une telle méthode. Chaque classe ayant des liens avec les autres, comment écrire des requêtes SQL propres et facilement maintenables ? J'ai l'impression de devoir inévitablement partir sur une usine à gaz. Pour charger un Personnage, il faut commencer par charger tous les sorts qui y sont stockés, dans le dictionnaire "sorts". Pour charger un Joueur, il faut que tous les comptes soient déjà chargés, etc. Une salle contient une référence de tous les joueurs qui s'y trouvent... et chaque joueur possède une référence de la salle dans laquelle il se trouve... bref, il y a de très nombreux liens entre toutes les classes du projet et je peine à déterminer comment et dans quel ordre je dois traiter tout ça pour stocker/charger le tout dans/de la base de données. Surtout que chaque liste et chaque dictionnaire Python se traduira obligatoirement dans la base de données par une classe d'association... bref, je vais me retrouver avec une centaine de tables pour modéliser le tout.
Méthode 2 : utilisation d'un ORM
J'utilise un ORM, comme SQLAlchemy qui est censé faciliter le mapping objet-relationnel. Mais que pensez-vous d'une telle méthode ? Est-ce aisé de convertir un projet déjà mature à SQLAlchemy ? Et quid de la base de données générée par SQLAlchemy ? J'aimerais garder une base propre et facilement consultable/modifiable à l'aide de SQL. J'ai peur qu'SQLAlchemy me génère un peu tout et n'importe quoi.
Bref, je suis un peu perdu et j'ai du mal à voir par quel bout je peux commencer cette conversion. Si quelqu'un a des conseils, des retours d'expérience, des remarques, je prends.
Merci à vous !
Partager