2013-06-10 2 views
2

J'ai une base de données existante dont la structure est utilisée dans l'ensemble de l'application. Les instances des bases de données sont périodiquement pivotées. J'ai un fichier de base de données template.sqlite qui est utilisé comme modèle pour toutes les bases de données nouvellement créées. Je veux l'utiliser, pas un script de création, de sorte que je dois maintenir un seul fichier, le modèle de base de données vide lui-même.Comment créer une base de données en mémoire avec un schéma basé sur une base de données de fichiers existante

Je voudrais créer une base de données en mémoire avec la même structure basée sur ce fichier modèle. Je sais que je peux ouvrir la base de données et lire sa structure, puis créer la base de données manuellement dans la mémoire

Si possible, j'aimerais pouvoir le faire de manière plus automatique.

+0

http://www.sqlite.org/inmemorydb.html –

Répondre

1

Vous pouvez utiliser la commande .dump du command-line shell pour créer un ensemble de commandes SQL que vous pouvez exécuter.

Vous pouvez également utiliser le backup API pour copier le modèle dans une nouvelle base de données.

+0

Dumping le script est ce que je voudrais avaid. Je devrais alors maintenir le script et le mettre à jour avec le changement de schéma. L'API de sauvegarde, cependant, semble être exactement ce dont j'ai besoin! – Dariusz

+0

@Dariusz: notez que la génération du script pourrait être automatisée dans le cadre du processus de construction. –

+0

@MatthieuM. oui il pourrait, mais la mise en place est plus de travail que de simplement lire la DB qui existe déjà avec les quelques lignes de code ci-dessous. En outre, cela dépendrait d'un autre outil qui doit être présent sur le système qui fait la construction, qui à son tour est une autre dépendance inutile. – Dariusz

0

En tant que solution rapide pour toute réponse cherchant à cette question: un peu de code C qui fait l'affaire:

int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename){ 
    int rc; 
    sqlite3 *pFile;   /* Database connection opened on zFilename */ 
    sqlite3_backup *pBackup; /* Backup object used to copy data */ 

    rc = sqlite3_open(zFilename, &pFile); 
    if(rc==SQLITE_OK) { 

    pBackup = sqlite3_backup_init(pInMemory, "main", pFile, "main"); 
    if(pBackup){ 
     (void)sqlite3_backup_step(pBackup, -1); 
     (void)sqlite3_backup_finish(pBackup); 
    } 
    rc = sqlite3_errcode(pTo); 
    } 

    (void)sqlite3_close(pFile); 
    return rc; 
} 
Questions connexes