2

我有一个奇怪的行为,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.pysyncdb,shellsqlall.

#!/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 中的monitorINSTALLED_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'行并返回错误。

这里发生了什么?

4

1 回答 1

0

我认为你也应该尝试在上面'monitor'移动。它可能会解决问题。'remusdb'INSTALLED_APPS

IE

    INSTALLED_APPS = (
        ...
        'monitor',
        'remusdb'
    )
于 2012-11-08T03:06:22.220 回答