Comparaison de plusieurs tables avec plusieurs base de donnée [Résolu]

Signaler
Messages postés
122
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
30 juillet 2020
-
Messages postés
29643
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 septembre 2020
-
Bonjour,

J'ai un code qui permet de relié plusieurs base de donnée et de faire la comparaison de tous ces bases.
Mon problème c'est que chaque base ne contient qu'un seul table fournisseurs chacun, et j'aimerais insérer un autre table client. Alors comment modifier la requête sql de façons à ce qu'elle puissent faire la comparaison de plusieurs tables et non un seul table.
Voici mon code:
import sqlite3

def create_table(db_name, values):
    con = sqlite3.connect("./databases/%s.db" % db_name)
    cur = con.cursor()
    cur.execute(
        '''CREATE TABLE fournisseurs(
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            nom TEXT
        )'''
    )
    s = ','.join(('(?)',) * len(values))
    cur.execute('INSERT INTO fournisseurs(nom) VALUES %s' % s, values)
    con.commit()
    con.close()


def tables_dif(main_db_name, *db_names):
    con = sqlite3.connect(":memory:")
    con.execute("ATTACH DATABASE './databases/%s.db' AS main_db" % main_db_name)
    cur = con.cursor()
    res = {}
    for db_name in db_names:
        con.execute("ATTACH DATABASE './databases/%s.db' AS db" % db_name)
        sql = '''
        SELECT t2.id, t2.nom
        FROM db.fournisseurs as t2
        LEFT JOIN main_db.fournisseurs as t
        USING(nom)
        WHERE t.nom IS NULL
        '''
        cur.execute(sql)
        res[db_name] = cur.fetchall()
        con.execute("DETACH DATABASE db")
    con.close()
    return res


try:
    create_table('main', ('jojo', 'mimi', 'riri'))
    create_table('base1', ('jojo', 'riri', 'vévé'))
    create_table('base2', ('riri', 'lulu'))
except:
    pass

print(tables_dif('main', 'base1', 'base2'))


Cordialement!

1 réponse

Messages postés
12228
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 septembre 2020
688
bonjour,
tu pourrais par exemple modifier la requête SQL ainsi:
SELECT "fournisseurs", t2.id, t2.nom
        FROM db.fournisseurs as t2
        LEFT JOIN main_db.fournisseurs as t
        USING(nom)
        WHERE t.nom IS NULL
UNION
SELECT "client", t2.id, t2.nom
        FROM db.client as t2
        LEFT JOIN main_db.client as t
        USING(nom)
        WHERE t.nom IS NULL
Messages postés
122
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
30 juillet 2020
1 >
Messages postés
12228
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 septembre 2020

Oui, je crois que c'est une bonne idée, je veux essayer cette option! merci!
Messages postés
29643
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 septembre 2020
6 729 >
Messages postés
122
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
30 juillet 2020

Bonjour,

La logique serait alors que tu rajoutes un niveau au dessus de ton code où tu paramètres les tables à traiter, du style
FOR T in ('client','fournisseur','commande', ....)


ou même générer la boucle à partir du dictionnaire de données de la base, je ne sais pas si cela existe dans sqlite, comme
"select table_name from dictionnary"
Messages postés
122
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
30 juillet 2020
1 >
Messages postés
29643
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 septembre 2020

C'est un peu compliqué à faire mais je veux aussi essayer votre suggestion! merci!
Messages postés
122
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
30 juillet 2020
1
Merci, ça marche bien en appelons plusieurs fois la fonction, merci beaucoup à tous!
Messages postés
29643
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 septembre 2020
6 729 >
Messages postés
122
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
30 juillet 2020

Félicitations pour ta persévérance.