On Wed, 2009-05-13 at 14:40 -0400, J. Cliff Dyer wrote:
> On Wed, 2009-05-13 at 12:49 -0400, J. Cliff Dyer wrote:
> > Setup:
> > 
> > Ubuntu 9.04
> > Python 2.6.2
> > Django 1.0.2
> > Postgres 8.3.7
> > postgresql-psycopg2
> > 
> > I'm having issues using ./manage.py syncdb and ./manage.py flush with a
> > project of mine.  I've got an app, venues, which defines a
> > ManyToManyField.
> > 
> > After syncdb loads the fixtures, (and only if it tries to load fixtures)
> > it hits the following error:
> > 
> > {{{
> > [...]
> > Installing json fixture 'initial_data' from
> > '/cgi/django/apps/cdla_apps/venues/fixtures'.
> > Traceback (most recent call last):
> >   File "./manage.py", line 11, in <module>
> >     execute_manager(settings)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/__init__.py",
> > line 340, in execute_manager
> >     utility.execute()
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/__init__.py",
> > line 295, in execute
> >     self.fetch_command(subcommand).run_from_argv(self.argv)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/base.py", line
> > 192, in run_from_argv
> >     self.execute(*args, **options.__dict__)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/base.py", line
> > 219, in execute
> >     output = self.handle(*args, **options)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/base.py", line
> > 348, in handle
> >     return self.handle_noargs(**options)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/commands/syncdb.py",
> >  line 152, in handle_noargs
> >     call_command('loaddata', 'initial_data', verbosity=verbosity)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/__init__.py",
> > line 158, in call_command
> >     return klass.execute(*args, **options)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/base.py", line
> > 219, in execute
> >     output = self.handle(*args, **options)
> >   File
> > "/var/lib/python-support/python2.6/django/core/management/commands/loaddata.py",
> >  line 161, in handle
> >     cursor.execute(line)
> >   File "/var/lib/python-support/python2.6/django/db/backends/util.py",
> > line 19, in execute
> >     return self.cursor.execute(sql, params)
> > psycopg2.ProgrammingError: column "id" does not exist
> > LINE 1: ...LECT setval('"venue_member_id_seq"', coalesce(max("id"),
> > 1),...
> > }}}
> > 
> > The problem seems to be that VenueMember names its pk "id", but gives it
> > a db_column='venue_member_id' argument, as follows:
> > 
> > {{{
> > class VenueMember(_Model):
> >     id = models.AutoField(db_column='venue_member_id', primary_key=True)
> >     venue = models.ForeignKey(Venue)
> >     member = models.ForeignKey(Member)
> >     role = models.ForeignKey(Role, null=True, blank=True)
> >     dates = models.ManyToManyField(Date, blank=True, null=True)
> > }}}
> > 
> > This model is referenced in my Venue model in a
> > ManyToManyField(through='VenueMember'):
> > 
> > {{{
> > class Venue(_Model):
> >     # [... snip fields ...]
> >     member_set = models.ManyToManyField('Member',
> >                                         through='VenueMember',
> >                                         blank=True)
> > 
> > }}}
> > 
> > When the database gets created, it creates a sequence named
> > 'venue_member_venue_member_id_seq' on a column named 'venue_member_id',
> > but syncdb wants to access it via 'venue_member_id_seq', using the
> > column name 'id'.  
> > 
> > ./manage.py flush yields the following similar error:
> > 
> > {{{
> > Error: Database docsouth_gtts couldn't be flushed. Possible reasons:
> >       * The database isn't running or isn't configured correctly.
> >       * At least one of the expected database tables doesn't exist.
> >       * The SQL was invalid.
> >     Hint: Look at the output of 'django-admin.py sqlflush'. That's the
> > SQL this command wasn't able to run.
> >     The full error: relation "venue_member_id_seq" does not exist
> > }}}
> > 
> > Am I doing something wrong, or should I report a bug?  
> > 
> > Cheers,
> > Cliff
> > 
> 
> This seems to be closely related to ticket #10881
> (db.backends.postgresql.operations.sequence_reset_sql and M2M fields
> with non-integer PKs).  In fact, the bug can be seen in the code shown
> on the ticket description, though it's a different bug.  
> 
> My initial thought was to make the loop beginning at line 123
> (http://code.djangoproject.com/browser/django/trunk/django/db/backends/postgresql/operations.py#L123)
>  smarter by changing:
>    style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table()))
> 
> to:
> 
>    style.SQL_FIELD(qn('%s_%s_id_seq' % (f.m2m_db_table(), 
>           f.rel.through_model._meta.pk.column)))
> 
> and so on, but it occurs to me that if through=MyModel is set on the
> ManyToMany, the sequence on MyModel will already be handled by the loop
> at line 112.  I think I can code up a patch that will fix #10881 and my
> problem above in one fell swoop, with the caveat that in order for a
> ManyToManyField to function properly with a non-integer primary key, it
> will have to be defined as a model, and passed in explicitly with the
> through=MyModel syntax.
> 
> Patch forthcoming.
> 

I've attached a patch to #10881 that fixes the reported problem and also
fixes mine for ./manage.py dbsync operations, but not for ./manage.py
flush; I still get the same error.

Cheers,
Cliff



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to