Skip to content

Instantly share code, notes, and snippets.

@fish2000
Created September 30, 2010 05:20
Show Gist options
  • Save fish2000/604070 to your computer and use it in GitHub Desktop.
Save fish2000/604070 to your computer and use it in GitHub Desktop.
TARBALL DATABASE FIXTURE DUMPER, for django
#!/usr/bin/env python
# encoding: utf-8
"""
backupmodelstofixtures.py
TARBALL DATABASE FIXTURE DUMPER.
Created by FI$H 2000 on 2010-04-18.
Copyright (c) 2010 OST, LLC.
MIT License. It works, bitches.
Usage: fill in the blanks, run it, and collect your tarballed fixtures.
Tested by me on Debian and Mac OS -- it works in Textmate or from
the prompt. It will tell you what it is doing. On the Mac, it will
use /usr/bin/open -R to courteously reveal the finished tarball
in the Finder once it is done.
An enterprising Django fan could easily kill five minutes making it
into a management command.
"""
from __future__ import with_statement
import sys
from django.core.management import setup_environ
import settings
setup_environ(settings)
import os, tarfile, shutil
from datetime import datetime
from tempfile import mkdtemp, gettempdir
from django.core.management.commands.dumpdata import Command as Dumper
from django.core.management.base import CommandError
# some typical off-the-shelf models:
from django.contrib.auth.models import User
from django.contrib.sessions.models import Session
from tagging.models import Tag, TaggedItem
# fill your models in here.
from your_project.some_app import AModel, AnotherModel
from your_project.some_other_app import AndStillYetAnotherModel
# format the models as a dict,
# to match up with the management
# command 'app.model' syntax
appstogo = dict(
auth=(User,),
sessions=(Session,),
admin=(ContentType,LogEntry),
some_app=(AModel,AnotherModel),
some_other_app=(AndStillYetAnotherModel,)
# etc.
)
# it comes out like: 20100923-052013.tgz --
# they will chronologically sort themselves in a file listing.
timestamp = datetime.strftime(
datetime.now(),
"%Y%m%d-%H%M%S",
)
# change this to what you prefer and/or what your OS demands
#finaldestination = "/home/you"
finaldestination = "/Users/you/Desktop"
fixdir = mkdtemp(prefix='', suffix=timestamp)
fixtarfilename = "%s.tar.gz" % timestamp
fixtarname = os.path.join(gettempdir(), fixtarfilename)
fixtar = tarfile.open(fixtarname, "w:gz")
os.chdir(fixdir)
print "> Dumping model fixtures to temporary directory %s" % fixdir
print ""
for app, modls in appstogo.items():
for modl in modls:
try:
fix = Dumper.handle(Dumper(), "%s.%s" % (app, modl.__name__.lower()), format='json', indent=4)
except CommandError, message:
print "# dumpdata raised a CommandError: %s" % message
else:
fixname = "%s_%s.json" % (app, modl.__name__.lower())
print "+ Dumping all instances of %s to %s..." % (modl.__name__, fixname)
with open(os.path.join(fixdir, fixname), "w+") as fixh:
fixh.write(fix)
print ""
print "> Creating fixture archive in %s..." % fixtarname
for fixxx in os.listdir(fixdir):
fixtar.add(fixxx, recursive=False)
fixtar.close()
print ""
print "> Cleaning up..."
for dirty in os.listdir(fixdir):
os.remove(dirty)
os.rmdir(fixdir)
print "> Moving fixture archive to %s..." % finaldestination
shutil.move(fixtarname, finaldestination)
if os.path.exists('/usr/bin/open'):
print "> Revealing..."
os.system('/usr/bin/open -R %s' % os.path.join(finaldestination, fixtarfilename))
print "> Done."
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment