我从django开始。我有一些网站设置了SQLITE的工作,但是将DB引擎更改为PostgreSql Manage.py Syncdb返回错误。我已经搜索了2天,但对我来说仍然没有任何作用。'DB存在。
PostgreSQL正在运行:
/etc/init.d/postgresql status
Running clusters: 9.1/main
这是我的设置的一部分
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
谢谢!
我的建议是转到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)
将打印出每个查询时击中数据库,并希望您在尝试运行python manage.py syncdb
首先,您的数据库是否正确同步?尝试运行python manage.py syncdb
。如果这没有帮助,请继续阅读...
这是Postgres在查询产生错误时所做的事情,并且您尝试在错误的情况下尝试运行另一个查询而不首先退回交易。因此,您应该首先rollback
出现问题时的数据库状态。由于基于交易,它会引起问题。要解决它,您需要弄清楚在代码中执行不良查询的位置。
使用PostgreSQL Server中的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()
希望这会有所帮助。
在我的情况下,我必须禁用某些应用程序,执行SynCDB,再次启用应用程序,然后再次同步。