1

我正在开发一个新的 django 项目并遵循本教程。我正在尝试运行“使用 South 进行数据库迁移”步骤,python manage.py syncdb但出现以下错误:

(editorial)[hookedonwinter@hookedonwinter editorial (master *)]$ python manage.py syncdb
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/django/core/management/__init__.py", line 453, in execute_from_command_line
    utility.execute()
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/django/core/management/__init__.py", line 272, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/django/core/management/__init__.py", line 77, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/south/management/commands/__init__.py", line 13, in <module>
    from south.management.commands.syncdb import Command as SyncCommand
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/south/management/commands/syncdb.py", line 18, in <module>
    from south import migration
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/south/migration/__init__.py", line 11, in <module>
    from south.models import MigrationHistory
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/south/models.py", line 4, in <module>
    class MigrationHistory(models.Model):
  File "/Users/hookedonwinter/.virtualenvs/editorial/lib/python2.6/site-packages/django/db/models/base.py", line 97, in __new__
    new_class.add_to_class('_meta', Options(meta, **kwargs))
TypeError: Error when calling the metaclass bases
    __init__() keywords must be strings

这是我的 settings.py 文件:https ://gist.github.com/pjhoberman/5273653

目前还没有应用程序,只是一个空项目。我猜这是我的一个简单的忽视 - 有什么想法吗?


编辑

从评论:

  • 我还没有任何模型。只是按照那个教程,在我做任何模型工作之前,我试图从 South 开始。

  • 版本:

    • Django==1.5.1
    • 南==0.7.6
  • 如果我在 settings.py 中注释掉南,我会得到这个错误:

    $ python manage.py syncdb

    TypeError: Error when calling the metaclass bases __init__() keywords must be strings


编辑2

我重新开始并使用了 django 1.4,它可以工作。

编辑3

我将 python 更新到 2.7 并使用了 django 1.5,一切正常。

4

6 回答 6

2

底部的“TypeError”是解决方案。如果您使用低于 2.6.5 的 Python 版本,则会从 Django 1.5 收到此错误。有一个Django 错误报告和一个关于这个问题的讨论。可以说,错误信息不够直观。

OP是对的,没有一个答案可以解决这个问题。解决方案是:1)将 Python 升级到 2.7,2)将 Django 降级到 1.4。

于 2013-05-03T04:28:11.517 回答
1

我将 python 更新到 2.7 并使用了 django 1.5,一切正常。

没有一个答案真正解决了这个问题,所以我自己回答,因为现在有赏金我不能删除这个问题。

于 2013-04-09T20:57:24.193 回答
1

我认为问题出在数据库设置中的“~”字符上。尝试将设置#coding=utf-8作为第一行或第二行,看看会发生什么。

如果这不能解决您的问题,请在文件的同一目录中更改数据库文件名,manage.py如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'databasename.sql',
    }
}

我尝试按照您发布的教程创建一个新环境,我没有问题。但是,当我尝试使用数据库名称时(名称中带有“~”的数据库名称),我收到此错误:

(env) user@pc:/path >$  python manage.py syncdb --noinput
Syncing...
OperationalError: unable to open database file

我敢打赌,这个符号是你问题的根源......告诉我们这是否解决了你的问题!

于 2013-04-06T04:38:23.237 回答
0

南方有很好的记录,我相信你在经历过之后就会清楚。

这是教程。

http://south.readthedocs.org/en/0.7.6/tutorial/part1.html

还是为了让生活更简单..

1)下载南并将其添加到您的应用程序目录。
2) 在 settings.py 中将 'south' 添加到 INSTALLED APPS
3) 运行 syncdb
4) $ ./manage.py schemamigration appname --initial
5) $ ./manage.py migrate appname

这是一个非常基本的开始所需要的一切。

于 2013-04-02T18:40:09.203 回答
0

您需要 Python 2.6.5+ 才能运行 Django 1.5。这就是为什么降级到 Django 1.4 或升级到 Python 2.7 可以解决您的问题。

https://docs.djangoproject.com/en/dev/releases/1.5/#python-compatibility

于 2013-06-12T15:19:50.597 回答
0

似乎是数据库配置问题,试试这个。在文件的顶部:

import os

然后:

PROJECT_DIR = os.path.abspath(os.path.dirname(__file__))
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(PROJECT_DIR, 'yourdatabasename.db'),
    }
}

最后一个 syncdb 应该可以解决问题。您也可以尝试“python manage.py reset south”来修复APP中可能出现的问题。如果这不起作用,我建议您开始一个新问题以丢弃其他错误。

原帖:Django setup with sqlite3?

于 2013-04-03T00:04:11.510 回答