Avez vous une méthode “propre” pour jouer avec des Objets du model sans les sauvegarder en BDD sur #Django ?


Mais oui cher interlocuter du Web.

Créer un fichier “settings_test.py” à côté du fichier de settings, qui contient ça:

from settings import *
 
DATABASES['default'] = {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': ':memory:',
}

Et lancer les commandes ./manage.py avec --settings=settings_test :

Par exemple :

./manage.py shell --settings=settings_test
 
./manage.py runserver --settings=settings_test

Et voilà, toute manipulation va automatiquement sauvegarder les données en mémoire vive, et pas dans votre base de données initiale. Elles seront perdues à chaque redémarrage.

D’une manière générale, souvenez vous que vous pouvez faire autant de configurations alternatives et même dynamiques que vous le souhaitez avec les fichiers de settings : c’est juste du Python.

Si vous avez besoin des données de votre base de données initiale, vous pouvez faire une copie de la base de données et changer DATABASES pour pointer sur cette copie. Du coup vous manipulerez votre copie, et pas la base de données initiale.

Enfin, on peut manipuler plusieurs bases de données en même temps en faisant plusieurs entrées dans DATABASES (une ‘default’, une ‘test’, une ‘prod’, etc), par exemple :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres',
        'PASSWORD': 'secret of mana'
    }
    'test': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': ':memory:',
    }
}

On peut alors spécifier la base de données à utiliser, soit par paramètre de ./manage.py (--database=bdd_a_utiliser), soit directement dans le code de manipulation de l’ORM avec using :

>>> Model.objects.all() # tape dans le BDD par défaut
>>> Model.objects.using('test').all() # tape dans la bdd de test
>>> mon_model.save(using='test') # sauvegarde dans la bdd de test

3 thoughts on “Avez vous une méthode “propre” pour jouer avec des Objets du model sans les sauvegarder en BDD sur #Django ?

  • N.

    Heu, ouais on overide juste (on utilise une autre db, donc faut d’autres syncdb, etc), j’aurai plutôt espéré que seules les modifs de la base soient sauvegardés sur la 2nd base.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.