Hi guys -- Sorry for coming late to the party, but I'm just now catching up on django-dev.
I'm really glad to see you get the ball rolling on multiple db support, and once I'm dug out from my backlog I'll be happy to start reviewing code and helping out if I'm needed. However, before we get to that point, I've got some pretty serious API concerns with the current approach, so I think I should outline those before y'all go much further. I don't want you to expend much effort just to get a -1 smackdown. The current mechanism of defining "other" databases in the settings module is just fine, and the underlying mechanism of having queries/managers "know" their connection is similarly dandy. But the wheels come off when it comes to the "public" API where users will choose which connection they use. As far as I can tell, you've currently provided two hooks to use a secondary connection: set the model's default connection in the settings module (which is OK, I suppose, though I might want to nitpick the syntax a bit), and assigning to ``Model.objects.db``. This second one is a disaster waiting to happen -- you've had to muddy things up with threadlocals to work around some problems already. Also consider the "bookkeeping" you'd need to do to deal with objects across multiple database simultaneously (think sharding). You'd have to keep juggling ``Model.objects.db`` and saving old ones... ugh. Here's how I think it should work: * I'd like the default connection for each and every object to be the default database forever and always. I find putting models for default connections in settings distasteful and I'd rather just a single API for changing the connection (see below). However, I imagine I'll be in the minority here so I'm prepared to cede this point if necessary. * There needs to be an official API to get a model (or perhaps a manager) which references a different "context" -- ``Model.objects.db`` should be read-only. So you'd call some API method, and get back a sort of proxy object that uses the other connection. Here's a strawman API:: >>> from django import db >>> from someapp.models import Article >>> Article.objects.all() [... all Articles from the default database ...] >>> ArticlesOnOtherDatabase = db.get_model_for_other_connection(Article, "private") >>> ArticlesOnOtherDatabase.objects.all() [... all Articles from the database defined with the "private" key ...] This should make the threadlocal stuff unnecessary, and (to my eye) is a lot more sane than assigning the ``Manager.db``. Oh, and please choose a better better name than ``db.get_model_for_other_connection()``; given that you're building the bikeshed you might as well paint it, too. Jacob --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-developers?hl=en -~----------~----~----~----~------~----~------~--~---