Reputation: 3276
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
Reputation: 716
In my case, I had to disable some apps, do syncdb, enable apps again and syncdb again.
Upvotes: 0
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
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