Date Mon 29 March 2010

Sometimes I make changes to my django models that causes syncdb to not run and I can't figure out why. Here is an example of an error I might get:

python manage.py syncdb
.
. ommitted for brevity
.
    return self.get_query_set().get_or_create(**kwargs)
  File "/usr/lib/pymodules/python2.6/django/db/models/query.py",
    line 343, in get_or_create
    raise e
psycopg2.IntegrityError: duplicate key value violates unique
    constraint "auth_permission_pkey"

These messages are a bit opaque so one useful technique I found is to temporarily enable postgresql logging to a file:

sudo vim /etc/postgresql/8.3/main/postgresql.conf

Now add or uncomment the following:

log_destination = 'stderr'
logging_collector = on
log_directory = '/tmp'
log_statement = all

Next you need to restart PostgreSQL (obviously you dont want to do this on a production system without taking the needed precautions!).

sudo /etc/init.d/postgresql-8.3 restart

Next I ran my syncdb command again and at the same time watched my PostgreSQL logs being generated in /tmp (I used the unix tail command to do that):

2010-03-29 14:29:22 SAST LOG:  statement: INSERT INTO "auth_permission"
("name", "content_type_id", "codename") VALUES (E'Can add Clip', 64, E'add_clip')
2010-03-29 14:29:23 SAST ERROR:  duplicate key value violates unique
constraint "auth_permission_pkey"
2010-03-29 14:29:23 SAST STATEMENT:  INSERT INTO "auth_permission"
("name", "content_type_id", "codename") VALUES (E'Can add Clip', 64, E'add_clip')
2010-03-29 14:29:23 SAST LOG:  statement: ROLLBACK TO SAVEPOINT s1217227072_x1

Ok from that I could see that django was having trouble inserting entries into the auth_permissions table for my Clip model. The postgresql logging functions can prove indispensible when you just want to know what low level requests and responses are coming and going from your database.


Comments

comments powered by Disqus