On Fri, Dec 3, 2010 at 10:56 PM, Russell Keith-Magee < russ...@keith-magee.com> wrote:
> Hi all, > > I've been looking at #14799, and trying to work out the best approach > for a solution. I can see three options, none of which are are > particularly attractive. I'm looking for feedback on which one smells > the least. > > First off - the problem: > > * The test framework needs to create test databases > * The DB backend call to create the test database implies a call to > syncdb on that database > * But a post_syncdb handler can invoke a query on *any* database > * If the database required by the code in a post_syncdb handler > hasn't been created yet, the test system falls over during database > setup. > * The test databases are specified as a dictionary, so there's no > guarantee on the order in which tests databases are created. > > There is one obvious manifestation of this bug. If you run Django's > own test suite, and the 'other' alias is created before the 'default' > alias, the test suite fails to initialize, because the post_syncdb > handler for contenttypes tries to run ContentTypes.objects.get() on > the 'default' database, but that database doesn't exist yet. > > Jacob has committed an interim fix for this problem, which involves > simply ensuring that the 'default' database is created first. This > works for Django's own test suite, but doesn't work in the general > case -- if you have a router that directs contenttypes read queries to > 'other', the suite will fail for exactly the same reason. Similarly, > if you have some other post_syncdb handler with dependency on > something other than default, > > So - how can this be fixed? > > Option 1: The documentation approach: "You may only assume that the > default database exists when post_syncdb runs on a non-default > database". This is the non-solution; the current code on trunk will be > sufficient, but it will leave some users high and dry. > > Option 2: Force the use of SortedDict when defining DATABASES. This > removes the non-deterministic database creation order, but requires > imports in the settings file, and requires action on the part of every > person that has migrated to using the DATABASES format. > > Option 3: Split syncdb into two parts -- phase 1: create tables, and > phase 2: post_syncdb, custom SQL, index creation and initial data. > > I haven't implemented this -- but I've taken a look at what will be > needed, and it will be messy. The current syncdb command and > backend.create_test_db() API guarantees a full syncdb cycle, so > implementing this in a way that preserves backwards compatibility will > involve introducing a bunch of flags that only do partial syncdb runs > (either phase 1 or phase 2). There's also the question of whether this > will violate any existing expectations -- after all, we will be > effectively changing the order in which syncdb will be invoked in a > non-configurable way. > > Option 4: Introduce a per-database setting -- TEST_DEPENDENCIES -- > that allows the developer to explicitly encode the dependency between > databases. This means the developer can explicitly encode the > dependencies that exists in database creation order. We can default to > assuming 'everything depends on default' (which is what the current > trunk implements); but this gives end users the flexibility to define > any dependency they need. The patch on #14799 implements this solution > (although it needs some tests for the dependency resolution code and > documentation for the setting itself) > > My personal preference is for (4). I don't like the addition of a > setting, but it's a setting that most users will be able to ignore > (since there is a reasonably sensible default), and it is the most > explicit and configurable option available. > > Opinions? Alternatives? > > Yours, > Russ Magee %-) > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To post to this group, send email to django-develop...@googlegroups.com. > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com<django-developers%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en. > > I'm +1 on #4, as we discussed on IRC. Alex -- "I disapprove of what you say, but I will defend to the death your right to say it." -- Voltaire "The people's good is the highest law." -- Cicero "Code can always be simpler than you think, but never as simple as you want" -- Me -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-develop...@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.