Using only the DB part of Django

If you like Django’s ORM, it’s perfectly simple to use it “standalone”; I’ve written up several techniques for using parts of Django outside of a web context, and you’re free to use any of them (or roll your own).

Shane above seems to be a bit misinformed on this and a few other points — for example, Django can do multiple different databases, it just doesn’t default to that (you need to do a custom manager on the models which use something other than the “main” DB, something that’s not too hard and there are recipes floating around for it). It’s true that Django itself doesn’t do connection management/connection pooling, but personally I’ve always used external tools for that anyway (e.g., pgpool, which rocks harder than anything built in to an ORM ever could).

I’d suggest spending some time reading up and possibly trying a few likely Google searches (e.g., the post I linked you to comes up as the top result for “standalone Django script”) to get a feel for what will actually best suit your needs and tastes — it may be Django’s ORM isn’t right for you, and you shouldn’t use it if it isn’t, but unfortunately there’s a lot of misinformation out there which muddies the waters.

Editing to respond to Shane:

Again, you seem to be misinformed: SQLAlchemy needs to be configured (i.e., told what DB to use, how to connect, etc.) before you can run queries with it, so how is the fact that Django needs similar configuration (accomplished via your choice of methods — you do not need to have a full Django settings file) any disadvantage?

As for multiple DB support, you seem to be confused: the support is there at a low level. The query object — not QuerySet, but the underlying Query object it will execute knows what DB it’s connecting to, and accepts a DB connection as one of its initialization arguments. Telling one model to use one DB and another model to use another is as simple as setting up one method on a manager which passes the right connection info down into the Query. True, there’s no higher-level API for this, but that’s not the same as “no support” and not the same as “requires custom code” (unless you’d argue that configuring multiple DBs explicitly in SQLAlchemy, required if you want multiple DBs, is also “custom code”).

As for whether you end up indirectly using things that aren’t in django.db, well, so what? The fact that django.db imports bits of, say, django.utils because there are data structures and other bits of code which are useful for more than just an ORM is fine as far as I’m personally concerned; one might as well complain if something has external dependencies or makes use of standard Python libraries instead of being 100% self-contained.

Leave a Comment