78 votes

Comment puis-je fusionner plusieurs bases de données SQLite ?

Si je possède un grand nombre de bases de données SQLite, toutes avec le même schéma, quelle est la meilleure façon de les fusionner afin d'effectuer une requête sur toutes les bases de données ?

Je sais qu'il est possible d'utiliser ATTACHER pour le faire, mais il a une limite de 32 et 64 bases de données selon le système de mémoire de la machine.

1voto

Pedro Lobito Points 6794

Réponse tardive, mais vous pouvez utiliser :

#!/usr/bin/python

import sys, sqlite3

class sqlMerge(object):
    """Basic python script to merge data of 2 !!!IDENTICAL!!!! SQL tables"""

    def __init__(self, parent=None):
        super(sqlMerge, self).__init__()

        self.db_a = None
        self.db_b = None

    def loadTables(self, file_a, file_b):
        self.db_a = sqlite3.connect(file_a)
        self.db_b = sqlite3.connect(file_b)

        cursor_a = self.db_a.cursor()
        cursor_a.execute("SELECT name FROM sqlite_master WHERE type='table';")

        table_counter = 0
        print("SQL Tables available: \n===================================================\n")
        for table_item in cursor_a.fetchall():
            current_table = table_item[0]
            table_counter += 1
            print("-> " + current_table)
        print("\n===================================================\n")

        if table_counter == 1:
            table_to_merge = current_table
        else:
            table_to_merge = input("Table to Merge: ")

        return table_to_merge

    def merge(self, table_name):
        cursor_a = self.db_a.cursor()
        cursor_b = self.db_b.cursor()

        new_table_name = table_name + "_new"

        try:
            cursor_a.execute("CREATE TABLE IF NOT EXISTS " + new_table_name + " AS SELECT * FROM " + table_name)
            for row in cursor_b.execute("SELECT * FROM " + table_name):
                print(row)
                cursor_a.execute("INSERT INTO " + new_table_name + " VALUES" + str(row) +";")

            cursor_a.execute("DROP TABLE IF EXISTS " + table_name);
            cursor_a.execute("ALTER TABLE " + new_table_name + " RENAME TO " + table_name);
            self.db_a.commit()

            print("\n\nMerge Successful!\n")

        except sqlite3.OperationalError:
            print("ERROR!: Merge Failed")
            cursor_a.execute("DROP TABLE IF EXISTS " + new_table_name);

        finally:
            self.db_a.close()
            self.db_b.close()

        return

    def main(self):
        print("Please enter name of db file")
        file_name_a = input("File Name A:")
        file_name_b = input("File Name B:")

        table_name = self.loadTables(file_name_a, file_name_b)
        self.merge(table_name)

        return

if __name__ == '__main__':
    app = sqlMerge()
    app.main()

SRC : Outil pour fusionner des bases de données SQLite3 identiques

0 votes

Est-ce que cela permet de fusionner les deux bases de données ou de supprimer toutes les données de la base esclave et d'insérer toutes les données de la base maître ? Si cela fait cela, une simple copie de fichier fait la même chose mais plus rapidement. Le but est de fusionner uniquement les différences...

0voto

Taba Points 11

Si vous avez atteint le bas de ce fil et n'avez toujours pas trouvé votre solution, voici également un moyen de fusionner les tables de 2 ou plusieurs bases de données sqlite.

Essayez d'abord de télécharger et d'installer Navigateur de base de données pour les bases de données sqlite . Ensuite, essayez d'ouvrir vos bases de données dans 2 Windows et essayez de les fusionner par simple glisser-déposer d'une table à l'autre. Mais le problème est que vous pouvez simplement glisser et déposer seulement un Il n'est donc pas vraiment une solution pour cette réponse spécifique, mais il peut être utilisé pour gagner du temps lors de recherches supplémentaires si votre base de données est petite.

-9voto

Robert Gould Points 29406

Sans vouloir vous offenser, d'un développeur à l'autre, je crains que votre idée ne soit terriblement inefficace. Il me semble qu'au lieu d'unir des bases de données SQLite, vous devriez probablement stocker plusieurs tables dans le même fichier de base de données.

Cependant, si je me trompe, je suppose que vous pourriez ATTACHER les bases de données et ensuite utiliser une VIEW pour simplifier vos requêtes. Ou créer une table en mémoire et copier toutes les données (mais c'est encore pire en termes de performances, surtout si vous avez de grandes bases de données).

1 votes

La fusion de deux bases de données est utile lorsqu'un ingénieur de base de données travaille sur une copie différente, afin d'en modifier la structure ou le contenu de certaines manières, et qu'entre-temps, l'ancienne version active est modifiée par les utilisateurs.

0 votes

J'apprécie ces réactions, mais il serait plus approprié de commenter la question initiale plutôt que d'y répondre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X