2012-11-11 4 views
3

장고에서 시작합니다. 나는 SQLite를 사용하는 사이트를 만들었지 만 DB 엔진을 postgresql managedb로 변경 한 후 syncdb가 에러를 반환했다. 2 일 동안 인터넷 검색을 했는데도 아무것도 작동하지 않는다. 사용자 'joe'는 수퍼 유저 권한과 로컬 'joe 'db가 존재합니다.Django with postgresql - manage.py syncdb가 오류를 반환합니다.

PostgreSQL은 실행 :

$ 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 

감사 :

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

가 여기 내

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

의 일부 오류입니다!

+0

문제는 응용 프로그램에있었습니다. 오픈 소스 프로젝트이고 새로운 버전을 다운로드했는데이 문제는 더 이상 발생하지 않습니다. 감사합니다. – Michal

답변

1

내 제안은 django.db.backends.postgresql_psycopg2.base으로 이동하여 print query을 삽입하면 CursorWrapper처럼 보입니다. 내 경우 python manage.py syncdb

0

먼저 DB가 제대로 동기화 되었습니까? python manage.py syncdb을 실행 해보십시오. 이것이 도움이되지 않으면 ...

이것은 쿼리가 오류를 생성하고 오류가 발생했을 때 트랜잭션을 먼저 롤백하지 않고 다른 쿼리를 실행하려고 할 때 postgres가 수행하는 작업입니다. 그래서 당신은 먼저 rollback DB 상태가 잘못되었을 때해야합니다. 트랜잭션 기반이므로 문제가 발생합니다. 이 문제를 해결하려면 잘못된 쿼리가 실행되는 코드의 위치를 ​​파악해야합니다.

디버깅을 위해 postgresql 서버에서 log_statement 옵션을 사용하면 도움이 될 수 있습니다.

아래의 해결책은 동일한 오류가 발생했을 때의 해결책입니다.

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() 

희망이 도움이됩니다.

0

을 실행하려고 할 때

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

, 나는 syncdb을, 어떤 응용 프로그램을 사용하지 않도록했다 데이터베이스를 치는 모든 쿼리를 인쇄, 잘하면 당신이 문제가되는 SQL 쿼리를 식별 할 수 있도록 그 앱을 다시 활성화하고 syncdb를 다시 활성화하십시오.

관련 문제