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

Messages postés
94
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
16 octobre 2019
- - Dernière réponse : jee pee
Messages postés
26954
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 octobre 2019
- 16 oct. 2019 à 14:16
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!
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
8709
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2019
436
1
Merci
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

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 63146 internautes nous ont dit merci ce mois-ci

rasielblas
Messages postés
94
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
16 octobre 2019
> yg_be
Messages postés
8709
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 octobre 2019
-
Oui, je crois que c'est une bonne idée, je veux essayer cette option! merci!
jee pee
Messages postés
26954
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 octobre 2019
5557 > rasielblas
Messages postés
94
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
16 octobre 2019
-
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"
rasielblas
Messages postés
94
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
16 octobre 2019
> jee pee
Messages postés
26954
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 octobre 2019
-
C'est un peu compliqué à faire mais je veux aussi essayer votre suggestion! merci!
rasielblas
Messages postés
94
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
16 octobre 2019
-
Merci, ça marche bien en appelons plusieurs fois la fonction, merci beaucoup à tous!
jee pee
Messages postés
26954
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
16 octobre 2019
5557 > rasielblas
Messages postés
94
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
16 octobre 2019
-
Félicitations pour ta persévérance.
Commenter la réponse de yg_be