…
def __init__(self):
super(ModeleTableBiblio,self).__init__() bdExiste =
os.path.exists(NOM_FICHIER_BD) bd = QSqlDatabase.addDatabase('QSQLITE')
bd.setDatabaseName(NOM_FICHIER_BD) bd.open() if not bdExiste:
self.creeBD() self.litBD() def creeBD(self): QSqlQuery(''' CREATE TABLE genres (
genre_id INTEGER PRIMARY KEY, genre TEXT ) ''') QSqlQuery(''' CREATE
TABLE books ( book_id INTEGER PRIMARY KEY, title TEXT, author TEXT,
publisher TEXT, genre_id INTEGER, year INTEGER, summary TEXT, price FLOAT )
''') QSqlQuery(''' INSERT INTO genres (genre) VALUES ("---"), ("Biographie"),
("Fantastique"), ("Historique"), ("Policier"), ("Science-Fiction") ''') def litBD(self):
query = QSqlQuery(''' SELECT genre_id, genre FROM genres ORDER BY genre_id
''') self.idParGenre = OrderedDict() while query.next():
self.idParGenre[query.value(1)] = query.value(0) query = QSqlQuery(''' SELECT
book_id, title, author, publisher, genre, year, summary, price FROM books JOIN
genres ON genres.genre_id = books.genre_id ''') self.livres = [] while query.next():
livre = Livre(*(query.value(i) for i in range(8))) self.livres.append(livre) def
genres(self): return self.idParGenre.keys()
Voici quelques explications sur ces méthodes.
Attention : on a enlevé l'argument livres ! La liste de livres sera dorénavant créée
à l'intérieur du modèle, par lecture dans la base de données.
On teste l'existence du fichier de base de données et on sauvegarde le résultat dans
une variable car on a besoin de cette information plus loin (voir point ) ; si le
fichier n'existe pas, il est créé dans les instructions qui suivent.
Par ces trois instructions, on instancie QSqlDatabase , on crée le fichier de base de
données SQLite s'il n'existe pas encore et on ouvre la connexion ; à partir de ce
moment, on peut exécuter des requêtes SQL dans la base de données.
Si c'est la première exécution, on appelle creeBD qui va créer les tables dans la
base de données ; on appelle ensuite litBD pour lire les données de la base de
données ; cette méthode est appelée même la première fois, juste après creeBD ;
164
def __init__(self):
super(ModeleTableBiblio,self).__init__() bdExiste =
os.path.exists(NOM_FICHIER_BD) bd = QSqlDatabase.addDatabase('QSQLITE')
bd.setDatabaseName(NOM_FICHIER_BD) bd.open() if not bdExiste:
self.creeBD() self.litBD() def creeBD(self): QSqlQuery(''' CREATE TABLE genres (
genre_id INTEGER PRIMARY KEY, genre TEXT ) ''') QSqlQuery(''' CREATE
TABLE books ( book_id INTEGER PRIMARY KEY, title TEXT, author TEXT,
publisher TEXT, genre_id INTEGER, year INTEGER, summary TEXT, price FLOAT )
''') QSqlQuery(''' INSERT INTO genres (genre) VALUES ("---"), ("Biographie"),
("Fantastique"), ("Historique"), ("Policier"), ("Science-Fiction") ''') def litBD(self):
query = QSqlQuery(''' SELECT genre_id, genre FROM genres ORDER BY genre_id
''') self.idParGenre = OrderedDict() while query.next():
self.idParGenre[query.value(1)] = query.value(0) query = QSqlQuery(''' SELECT
book_id, title, author, publisher, genre, year, summary, price FROM books JOIN
genres ON genres.genre_id = books.genre_id ''') self.livres = [] while query.next():
livre = Livre(*(query.value(i) for i in range(8))) self.livres.append(livre) def
genres(self): return self.idParGenre.keys()
Voici quelques explications sur ces méthodes.
Attention : on a enlevé l'argument livres ! La liste de livres sera dorénavant créée
à l'intérieur du modèle, par lecture dans la base de données.
On teste l'existence du fichier de base de données et on sauvegarde le résultat dans
une variable car on a besoin de cette information plus loin (voir point ) ; si le
fichier n'existe pas, il est créé dans les instructions qui suivent.
Par ces trois instructions, on instancie QSqlDatabase , on crée le fichier de base de
données SQLite s'il n'existe pas encore et on ouvre la connexion ; à partir de ce
moment, on peut exécuter des requêtes SQL dans la base de données.
Si c'est la première exécution, on appelle creeBD qui va créer les tables dans la
base de données ; on appelle ensuite litBD pour lire les données de la base de
données ; cette méthode est appelée même la première fois, juste après creeBD ;
164
