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


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 ?

Leave a comment

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