Forum Programmation.python Python SQLite: les requêtes update ne fonctionne pas

Posté par  . Licence CC By‑SA.
0
10
fév.
2024

Bonjour,

J'ai créé un script python dont le but est de modifier la basse de données SQLite générée par l'application androïd MyLibrary.

Le problème est que au vu des log tout semble fonctionner, les requêtes sql semble bonnes…

2024-02-10 18:36:59 mypc __main__[14467] DEBUG (238, '[]', 'Le secret des Eïles', 1382, None, None, None, '0', 0, '9782302024380', 48, '05/12/2012', 'Soleil', 1, None, '[{"title":"legende","volume":6.0}]', "Après avoir reconquis son trône et passé quelques mois à remettre les choses en bon ordre, le chevalier Tristan s'aperçoit qu'il n'est pas fait pour régenter une cour. Il l'abandonne alors, choisissant une vie plus proche de la Nature qui l'a vu grandir.Mais ses nuits sont hantées par les Eïles, créatures envoûtantes qui essaient de lui voler son âme pendant son sommeil... Une crainte étrange s'éveille alors en lui, plus inquiétante encore que tous les combats périlleux menés jusqu'alors...", 'Le secret des Eïles', None, None, None)
coucou
YOLO
2024-02-10 18:36:59 archbertha __main__[14467] DEBUG UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238
UPDATE COMIC SET FNAC_URL = coucou AND AMAZON_URL = yolo AND IS_COMIC = 1 WHERE ID = 238

Sauf que quand, après avoir executer le scriptp je vérifie avec un select, rien n'a été modifier dans le base de donnée.

> $ sqlite3 mylibrary.db 'SELECT * FROM COMIC  WHERE ID IS 239;'
239|[]|Les forêts profondes|1383||||0|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes|||
> $ # Ca devrait etre
239|[]|yolo|1383||||coucou|0|2845657927|48|08/12/2004|Soleil Productions|1||[{"title":"legende","volume":2.0}]||Les forêts profondes||1|

Le script est le suivant:

#!/usr/bin/env python3
import argparse
import logging
import pathlib
import sqlite3
import coloredlogs

class Book:
    def __init__(self, row) -> None:
        self.is_comic = ""
        self.id = row[0]
        self.additional_authors = row[1]
        self.amazon_url = row[2]
        self.author = row[3]
        self.categories = row[4]
        self.comments = row[5]
        self.cover_path = row[6]
        self.fnac_url = row[7]
        self.in_wishlist = row[8]
        self.isbn = row[9]
        self.pages = row[10]
        self.published_date = row[11]
        self.publisher = row[12]
        self.read = row[13]
        self.reading_dates = row[14]
        self.series = row[15]
        self.summary = row[16]
        self.title = row[17]
        self.amazon_small_cover_url = row[18]
        self.amazon_cover_url = row[19]

    def correct_amazon_url(self):
        if not self.amazon_url.startswith("http"):
            print("YOLO")
            self.amazon_url = "yolo"

    def correct_fnac_url(self):
        if self.fnac_url != "":
            print("coucou")
            self.fnac_url = "coucou"


def main(args):
    logger.debug(args)
    connection = sqlite3.connect(args.db)
    cursor = connection.cursor()

    cursor.execute(f"SELECT * FROM {args.table}")
    for row in cursor.fetchall():
        book = Book(row)
        logger.info("id:" + str(book.id) + ":isbn:" + str(book.isbn))
        logger.debug(row)

        book.correct_fnac_url()
        book.correct_amazon_url()

        if args.table == "BOOK":
            book.is_comic = "0"
        else:
            book.is_comic = "1"

        sql_command = f"UPDATE {args.table} SET FNAC_URL = {book.fnac_url} AND AMAZON_URL = {book.amazon_url} AND IS_COMIC = {book.is_comic} WHERE ID = {book.id} "
        logger.debug(sql_command)
        cursor.execute(
            f"UPDATE {args.table} SET FNAC_URL = ? AND AMAZON_URL = ? AND IS_COMIC = ? WHERE ID = ?",
            (book.fnac_url, book.amazon_url, book.is_comic, book.id),
        )
        connection.commit()
    connection.close()


if __name__ == "__main__":
    coversPath = pathlib.Path(pathlib.Path(), "covers")
    dbPath = pathlib.Path(pathlib.Path(), "mylibrary.db")
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-v", "--verbose", action="count", help="increase output verbosity", default=0
    )
    parser.add_argument(
        "-d", "--db", action="store", help="DB path", type=pathlib.Path, default=dbPath
    )
    parser.add_argument(
        "-t", "--table", choices=["BOOK", "COMIC"], help="Wich table ?", required=True
    )
    args = parser.parse_args()

    logger = logging.getLogger(__name__)
    formatter = logging.Formatter(
        "%(asctime)s %(hostname)s %(name)s[%(process)d] %(levelname)s %(message)s"
    )
    if not args.verbose:
        coloredlogs.install(level="ERROR", logger=logger)
    elif args.verbose == 1:
        coloredlogs.install(level="WARNING", logger=logger)
    elif args.verbose == 2:
        coloredlogs.install(level="INFO", logger=logger)
    elif args.verbose >= 3:
        coloredlogs.install(level="DEBUG")
    else:
        logging.critical("Log level fail !!!")

    main(args)

Merci par avance.

PS: Connaissez vous une application du même style opensource ?

  • # AND ?

    Posté par  (Mastodon) . Évalué à 6.

    Tu as mis un AND entre les arguments de colonnes, c'est pas plutôt une simple virgule ?

    UPDATE {args.table} SET FNAC_URL = {book.fnac_url}, AMAZON_URL = {book.amazon_url}, IS_COMIC = {book.is_comic} WHERE ID = {book.id} "

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # autres

    Posté par  (site web personnel, Mastodon) . Évalué à 4.

    PS: Connaissez vous une application du même style opensource ?

    J’utilise Book Catalogue depuis quelques années déjà, et il a pratiquement une trentaine de champs
    Il y a aussi, sur f-droid : Bookland, BookWorm, Book Listing App et Google Books Viewer qui sont centrés sur Google, badreads et openreads dont je suppose que les noms font un clin d’œil à goodreads dont ils reprennent certains trucs (objectifs de lecture annuelle et graphes).
    Par contre ils n’ont pas de fnac_url ni de amazon_url

    “It is seldom that liberty of any kind is lost all at once.” ― David Hume

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.