3

私はDjangoから始めています。SQLiteが機能するようにいくつかのサイトをセットアップしましたが、DBエンジンをpostgresqlに変更した後manage.py syncdbはエラーを返します.2日間グーグルを続けていますが、それでも何も機能しません.Postgresユーザー「joe」にはスーパーユーザー権限とローカル「joe」があります'dbが存在します。

Postgresqlが実行されています:

/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',                       .
    }
}

そしてエラー:

$ 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

ありがとう!

4

3 に答える 3

1

私の提案は、のようにに移動しdjango.db.backends.postgresql_psycopg2.baseて挿入するprint queryことですCursorWrapper

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

これにより、データベースにヒットするすべてのクエリが出力され、実行しようとしたときに問題のあるSQLクエリを特定できるようになります。python manage.py syncdb

于 2012-11-17T22:26:33.283 に答える
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()

お役に立てれば。

于 2012-11-11T19:12:26.900 に答える
0

私の場合、いくつかのアプリを無効にし、syncdbを実行し、アプリを再度有効にして、syncdbを再度有効にする必要がありました。

于 2014-05-09T00:15:48.767 に答える