Michal
Michal

Reputation: 3276

Django with postgresql - manage.py syncdb returns errors

I'm starting with Django. I had some site set up with SQLite working but after changing DB engine to postgresql manage.py syncdb returns errors.I've been googling for 2 days but still nothing works for me.Postgres user 'joe' has superuser rights and local 'joe' db exists.

Postgresql is running:

/etc/init.d/postgresql status
Running clusters: 9.1/main

Here's my part of settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',  #
        'NAME': 'joe',                                       # 
        'USER': 'joe',                                       # 
        'PASSWORD': 'asdf',                                  # 
        'HOST': 'localhost',                                 # 
        'PORT': '5432',                       .
    }
}

And the errors:

$ python manage.py syncdb
Syncing...
Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/south/management/commands/syncdb.py", line 90, in handle_noargs
    syncdb.Command().execute(**options)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 59, in handle_noargs
    tables = connection.introspection.table_names()
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/db/backends/__init__.py", line 792, in table_names
    return self.get_table_list(cursor)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/db/backends/postgresql/introspection.py", line 31, in get_table_list
    AND pg_catalog.pg_table_is_visible(c.oid)""")
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/home/m/.virtualenvs/mayan/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: current transaction is aborted, commands ignored until end of transaction block

Thanks!

Upvotes: 3

Views: 2176

Answers (3)

Jose Luis de la Rosa
Jose Luis de la Rosa

Reputation: 716

In my case, I had to disable some apps, do syncdb, enable apps again and syncdb again.

Upvotes: 0

mrmagooey
mrmagooey

Reputation: 4982

My suggestion would be to go to django.db.backends.postgresql_psycopg2.base and insert a print query so that CursorWrapper looks like.

class CursorWrapper:
    ...
    def execute(self, query, args=None):
        print query # New print statement here
        try:
            return self.cursor.execute(query, args)

That will print out every query hitting the database, and hopefully allow you to identify the offending SQL query when trying to run python manage.py syncdb

Upvotes: 1

Srikar Appalaraju
Srikar Appalaraju

Reputation: 73608

First, is your DB properly synced? Try running python manage.py syncdb. If this does not help, then read on...

This is what postgres does when a query produces an error and you try to run another query without first rolling back the transaction in case of error. So you should first rollback the DB state when something goes wrong. Since its transactional based, it causes problems. To fix it, you'll want to figure out where in the code that bad query is being executed.

It might be helpful to use the log_statement option in your postgresql server for debugging.

The below solution is what I came up when I had same error.

from django.db import transaction

@transaction.commit_manually
def db_insert():
    try:
        YourModel(name='hello world').save() #trying to save
    except: #any error rollback
        transaction.rollback()
    else: #if all fine, commit
        transaction.commit()

Hope this helps.

Upvotes: 0

Related Questions