我有syncdb
的奇怪行为,我知道它过去有效。自上次执行syncdb
以来,我对模型进行了更改,但更改很少,主要是为我的模型添加列。 syncdb
现在无法创建表,因为它尚不存在。我真的不明白为什么。
我的django项目有两个包。我称之为remusdb
的第一个包或多或少是一个使用django.db.models.Model
进行数据库通信的独立应用程序。对于使用我的remusdb
包的应用程序,我编写了一个类似于
settings.py
文件
REMUSDB_DB_ID = "remusdb"
DATABASES = {
'default': {
# django.db needs a "default" database
# make django.db happy.
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/dev/null',
},
REMUSDB_DB_ID: {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'remusdb',
'OPTIONS': { 'autocommit': True },
}
}
DATABASE_ROUTERS= [ "remusdb.RemusDBRouter" ]
SECRET_KEY = "Make.here.something.random"
INSTALLED_APPS = (
'remusdb'
)
这个想法是这个应用程序可以确定一个带有自定义名称的数据库,如果你在django projetc中包含remusdb
,那么你不需要通过创建{{1}来混淆数据库 - 默认数据库中的数据库。因此,我还编写了一个数据库路由器,只要您使用remusdb
中的模型,就会自动使用REMUSDB_DB_ID
进行读写访问。
这作为一个独立的应用程序很好用,我没有任何问题。我甚至创建了一些小脚本来运行来自remusdb.models
的命令,例如manage.py
,syncdb
和shell
。
sqlall
调用#!/usr/bin/env python
# filename: remusdb_syncdb
import sys
import os
import re
if __name__ == "__main__":
if len(sys.argv) != 2:
t = "Usage: %s settings-unix-path\n" % sys.argv[0]
t += "\n"
t += "settings-unix-path The path of the settings module\n"
t += " in Unix-path format.\n\n"
t += "NOTE: DO NOT USE %s if you are using RemusDB\n" % sys.argv[0]
t += "inside of a Django application. In this case please call\n"
t += "python manage.py syncdb && \\\n"
t += " python manage.py syncdb --database=<your database name>"
sys.exit(t)
settings_list = sys.argv[1].split("/")
mod_settings = settings_list[-1]
del settings_list[-1]
settings_path = '/'.join(settings_list)
if settings_path == "":
settings_path = "."
mod_settings = re.sub(r'\.py$', "", mod_settings)
sys.path.append(settings_path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", mod_settings)
from django.core.management import execute_from_command_line
from django.conf import settings
argv = [sys.argv[0], "syncdb", "--database=%s" % settings.REMUSDB_DB_ID]
execute_from_command_line(argv)
数据库已创建,我可以使用我的应用程序。
现在我想在我的django项目中使用remusdb_syncdb <path to settings>/settings.py
,该项目有自己的数据库,我不想与remusdb
数据库混合使用。我必须根据上面的示例更改remusdb
文件,它看起来像这样:
settings.py
当我第一次添加... the usual stuff
REMUSDB_DB_ID = "remusdb"
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'remusweb', # Or path to database file if using sqlite3.
},
REMUSDB_DB_ID: {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'
'NAME': 'remusdbdev', # Name of DB or path if sqlite is used as engine
'OPTIONS': { 'autocommit': True },
}
}
DATABASE_ROUTERS= [ "remusdb.RemusDBRouter" ]
...
INSTALLED_APPS = (
...
'remusdb',
'monitor'
)
...
作为django项目的依赖项时,我创建了数据库remusdb
并执行了createdb remusdbdev
并创建了python manage.py syncdb --database=remusdb
中的表。
开发django应用程序两个月后,我不得不在remusdbdev
的某些表中添加列,我不想自己执行sql代码。所以我发了remusdb
并且正在运行dropdb remusdbdev
现在生成了这个错误:
python manage.py syncdb --database=remusdb
嗯,当然它还不存在, File "/home/shaoran/devpython/lib/python2.6/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "remus_process" does not exist
LINE 1: ..."."last_stop", "remus_process"."last_change" FROM "remus_pro...
的意思是它创建表。有趣的是,如果我使用django的设置执行syncdb
(来自我的独立应用)(我必须临时删除remusdb_syncdb
中的monitor
行),然后INSTALLED_APPS
创建表。之后syncdb
不再失败。
我在这里遗漏了什么吗?为什么我能够在过去执行python manage.py syncdb
,现在我得到了这个奇怪的错误?
在提交之前阅读我的问题时,我想到了我是如何开始django项目的。我创建了django项目,并在manage.py syncdb --database=remusdb
中添加了settings.py
所需的更改。 然后我第一次执行了remusdb
。现在我有了第二个包syncdb
,它包含视图和模板。所以我再次删除了数据库,再次创建它,这次我暂时从monitor
删除'monitor'
行。然后我执行INSTALLED_APPS
并且它运行没有问题。下次我重复这些步骤但我没有暂时删除python manage.py syncdb --database=remusdb
行并返回错误。
这里发生了什么?
答案 0 :(得分:0)
我认为您还应该尝试将'monitor'
移到'remusdb'
INSTALLED_APPS
之上。它可能会解决问题。
即
INSTALLED_APPS = (
...
'monitor',
'remusdb'
)