Hello Russel,

Ticket submitted: http://code.djangoproject.com/ticket/13975

IIRC there has been no identifier length warnings when I have validated or synced the tables.

While I was at it, I also filed a ticket about a pet-peeve in the admin view: http://code.djangoproject.com/ticket/13976

On Wed, 21 Jul 2010 04:45:06 +0200, Russell Keith-Magee <russ...@keith-magee.com> wrote:

Hi Yngve --

I just wanted to let you know that your report has been heard -- I
just haven't got a lot of spare cycles at the moment to dig into this
problem. Hopefully that situation will improve in the near future.

Here's some quick and (possibly) helpful explanatory notes:

Django 1.2 started imposing a 63 character limit on long names. In
Django 1.1, >63 character names were legal, but would raise warnings
under PostgreSQL. Under 1.2, we use a hashing behavior to collapse >63
character names into the PostgreSQL allowed namespace.

So, if you are ignoring the identifier length warnings under Django
1.1, it's possible that the table/column/sequence names may not be
100% compatible with Django 1.2. However, since PostgreSQL is raising
a warning advising that the 1.1 names are bad, this comes under the
category of bug fix, rather than breaking backwards compatibility.

Like I said, I hope to be able to dig into this problem in more depth
in the near future. In the interim, if you could open a ticket logging
this problem (along with all the very helpful debugging details and
test case you have gleaned in your investigation), I'd be much
obliged.

Yours,
Russ Magee %-)

On Wed, Jul 21, 2010 at 9:18 AM, Yngve Nysaeter Pettersen
<yn...@opera.com> wrote:
Hi again,

This seems to have to do with long names on ManyToMany members, when
model_bar_foo_id_seq exceeds 63 characters, there is also a similar problem
if the referenced class name is too long.

I have now created a small testcase.

When running the foobar_test.py script after doing syncdb from Django 1.1.1
all four tests works in Django 1.1.1, while the fourth fails in 1.2.1 as
mentioned below.

Then, when deleting the tables and syncdb-ing from Django 1.2.1 the fourth
test still does not work, while the tests still works in 1.1.1.

Therefore, this seems to be a bug in Django 1.2.1.

There is some complaint when doing syncdb, but they seem to be for some
other database operation, not configuring the tables.

It is possible that http://code.djangoproject.com/changeset/13328 may have
fixed part of the problem, but when testing the last_insert_id() part of
that fix, it did not work with names that contain upper case characters. I
have not tested the full fix.

On Tue, 20 Jul 2010 20:21:33 +0200, Yngve Nysaeter Pettersen
<yn...@opera.com> wrote:

Hello all,

By accident I have ended up with a mixed Django 1.1.1 and Django 1.2.1
environment, on different machines.

I am currently considering whether to downgrade the 1.2 installations, or
upgrade the older ones, or keep the current setup, but this depends on
finding a solution to an apparent incompatibility between 1.1 and 1.2, and
whether or not the upgrade can cause other problems.

The current applications, including the configuration of the Postgresql
8.3, have all been developed in v1.1.1

While this have not caused problems for one of my applications (AFAICT), I've discovered that v1.2 is apparently not compatible with the ManyToMany relations used in a second application, causing an exception to be thrown
when adding to the many to many field:


File "/usr/lib/pymodules/python2.5/django/db/models/fields/related.py",
line 490, in add
self._add_items(self.source_field_name, self.target_field_name, *objs) File "/usr/lib/pymodules/python2.5/django/db/models/fields/related.py",
line 574, in _add_items
    '%s_id' % target_field_name: obj_id,
File "/usr/lib/pymodules/python2.5/django/db/models/query.py", line 352,
in create
    obj.save(force_insert=True, using=self.db)
File "/usr/lib/pymodules/python2.5/django/db/models/base.py", line 435,
in save
    self.save_base(using=using, force_insert=force_insert,
force_update=force_update)
File "/usr/lib/pymodules/python2.5/django/db/models/base.py", line 528,
in save_base
    result = manager._insert(values, return_id=update_pk, using=using)
  File "/usr/lib/pymodules/python2.5/django/db/models/manager.py", line
195, in _insert
    return insert_query(self.model, values, **kwargs)
  File "/usr/lib/pymodules/python2.5/django/db/models/query.py", line
1479, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/lib/pymodules/python2.5/django/db/models/sql/compiler.py",
line 789, in execute_sql
    self.query.model._meta.db_table, self.query.model._meta.pk.column)
  File
"/usr/lib/pymodules/python2.5/django/db/backends/postgresql/operations.py",
line 57, in last_insert_id
    cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name,
pk_name))
  File
"/usr/lib/pymodules/python2.5/django/db/backends/postgresql_psycopg2/base.py",
line 44, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "model_bar_foo_id_s" does not
exist

A condensed example of my code (not tested independently) is the
following:

  class foo(models.Model):
       #declarations

  class bar(models.Model):
       foo_list = models.ManyToManyField(foo, null=True)

       def update_foo(x):
               self.foo_list.add(x)

The call to "self.foo_list.add()" is what triggers the above exception.

AFAICT the SQL code generated by sqlall by v1.1.1 is equivalent to the
code generated by 1.2.1 (in v1.2.1 there is a use of ALTER in the
bar-reference of the many-to-many table). There is however no mention in the
sqlall output of an identifier with the name reported by the exception,
though it is possible that it may be an identifier generated server-side, or
that it would be generated in a resetdb situation.

I have not been able to discover any mention of such a problem in the v1.2
release notes.

While there will be no significant problem replacing this particular
application's set of tables after an upgrade, since the application is
currently not in production and I had just wiped the tables anyway, I am concerned that there may be issues in the currently working application that
I have not yet discovered.

Is there a setting in v1.2 that I can use to tell the database handler
that the tables were generated by v1.1? Or is there another reason for this
problem?

For reference:
  - the psycopg2 version on the 1.1 installation is 2.0.13 (windows and
Linux), the one on the 1.2 installation is 2.0.14 (linux)
- the names of the classes are much longer than used here (63 characters
for the id_s name).
  - There are many more ManyToMany uses in the model used by this
application, including the class implicated in the exception.



--
Sincerely,
Yngve N. Pettersen
********************************************************************
Senior Developer                     Email: yn...@opera.com
Opera Software ASA                   http://www.opera.com/
Phone:  +47 23 69 32 60              Fax:    +47 23 69 24 01
********************************************************************

--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en.





--
Sincerely,
Yngve N. Pettersen
********************************************************************
Senior Developer                     Email: yn...@opera.com
Opera Software ASA                   http://www.opera.com/
Phone:  +47 23 69 32 60              Fax:    +47 23 69 24 01
********************************************************************

--
You received this message because you are subscribed to the Google Groups "Django 
users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to