manage.py syncdb无法创建表,因为它们不存在

时间:2012-10-05 08:47:40

标签: django

我有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.pysyncdbshell

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行并返回错误。

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

我认为您还应该尝试将'monitor'移到'remusdb' INSTALLED_APPS之上。它可能会解决问题。

    INSTALLED_APPS = (
        ...
        'monitor',
        'remusdb'
    )