Sqlite3.OperationalError: too many attached databases - max 10 [Résolu]

Messages postés
85
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
9 octobre 2019
- - Dernière réponse : rasielblas
Messages postés
85
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
9 octobre 2019
- 9 oct. 2019 à 07:56
Bonjour,


J'ai relié plusieurs base de donnée en python avec sqlite et cela m'a provoqué une erreur
sqlite3.OperationalError: too many attached databases - max 10.
D'après le documentation, le nombre de base de donnée attaché est limité à 10 est qu'on peut définir ce limite à >10 avec sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size). Mais le problème c'est que je ne sais pas comment mettre en pratique ce code, est j'ai beau chercher partout mais je n'ai pas trouvé un exemple d'utilisation. Pouvez vous m'aider s'il vous plaît. Voici mon code

import sqlite3
import os

#Création de la connexion
connection1 = sqlite3.connect("mabaseTotal.esd")
connection2 = sqlite3.connect("mabase1.esd")
connection3 = sqlite3.connect("mabase2.esd")


#Fusion de la base 1,2,3,4,5,6,7,8,9,10,11,12,.....
connection1.execute("ATTACH Database 'mabase1.esd' as db1")
connection1.execute("ATTACH Database 'mabase2.esd' as db2")

connection1.commit()
#Fermeture de la connexion
connection1.close()


Cordialement.
Afficher la suite 

2 réponses

Meilleure réponse
1
Merci
Bonjour.

J'ai fait quelques recherches, dans l'api sqlite de python, il y a bien une méthode Connection.set_limit, malheureusement celle-ci n'est disponible qu'avec les bonnes options fournies lors de la compilation de sqlite...

Mais quel intérêt de vouloir aggréger autant de bases ?
Tu pourrais les attacher, faire tes manipulations, puis les détacher.
J'ai un peu testé, et ça fonctionne très bien.

En prenant pour pseudo base ce que tu as effectué dans ton précédent sujet, voici un simple exemple (nécessite un répertoire "databases").

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'))

Dire « Merci » 1

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

CCM 62394 internautes nous ont dit merci ce mois-ci

rasielblas
Messages postés
85
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
9 octobre 2019
-
Votre réponse dépasse mes espérances! c'est bien ce que je voulais faire, merci non seulement ça marche mais aussi vous avez ajouté une nouvelle fonctionnalité qui m'es très utile!
rasielblas
Messages postés
85
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
9 octobre 2019
-
Pardonne moi d'avoir déterrer ce sujet car j'ai une autre question sur le même sujet, sur ce code chaque base a un seul table et j'aimerais savoir si on rajoute chacune des bases une autre table par exemple table client, alors comment fait-on pour comparer tous les tables dans un seul requête?
yg_be
Messages postés
8674
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 octobre 2019
432 > rasielblas
Messages postés
85
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
9 octobre 2019
-
peux-tu plutôt marquer cette question comme résolue, via la roue dentée à droite du titre, et poser une autre question. pour ta nouvelle question, il sera sans doute utile que tu nous montres ton code.
rasielblas
Messages postés
85
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
9 octobre 2019
-
Ok!
Commenter la réponse de khrug
Messages postés
8674
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 octobre 2019
432
0
Merci
bonjour, tu atteins la limite avec 2 bases?
rasielblas
Messages postés
85
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
9 octobre 2019
-
Bonjour! non, ceci est une exemple mais j'ai plusieurs bdd!
Commenter la réponse de yg_be