我有一个奇怪的行为,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'
)
这个想法是这个应用程序可以确定一个具有自定义名称的数据库,如果您包含remusdb
在 django projetc 中,那么您不需要通过remusdb
在默认数据库中创建 -databases 来混淆数据库。因此,我还编写了一个数据库路由器,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)
调用remusdb_syncdb <path to settings>/settings.py
数据库被创建,我可以使用我的应用程序。
现在我想remusdb
在我的 django 项目中使用它,它有自己的数据库,我不想与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'
)
...
当我第一次添加remusdb
作为 django 项目的依赖项时,我创建了数据库createdb remusdbdev
并执行,然后创建python manage.py syncdb --database=remusdb
了表remusdbdev
。
在开发 django 应用程序两个月后,我不得不在其中的一些表中添加列,remusdb
并且我不想自己执行 sql 代码。所以我制作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...
好吧,当然它还不存在,关键syncdb
是它创建了表。有趣的是,如果我remusdb_syncdb
使用 django 的设置执行(从我的独立应用程序)(我必须暂时删除 in 中的monitor
行INSTALLED_APPS
)然后syncdb
创建表。之后python manage.py syncdb
不再失败。
我在这里错过了什么吗?为什么我过去能够执行manage.py syncdb --database=remusdb
,现在却出现这个奇怪的错误?
在提交之前阅读我的问题时,我想到了我是如何开始 django 项目的。我创建了 django 项目并添加了工作settings.py
所需的更改remusdb
。然后我syncdb
第一次执行。现在我有了第二个包,monitor
它有视图和模板。所以我再次删除了数据库,再次创建它,这次我暂时'monitor'
从INSTALLED_APPS
. 然后我执行python manage.py syncdb --database=remusdb
并运行没有问题。下次我重复这些步骤但我没有暂时删除该'monitor'
行并返回错误。
这里发生了什么?