OperationalError:初始syncdb上没有这样的表

时间:2014-01-10 04:40:40

标签: django sqlite syncdb operationalerror

我正在运行syncdb来创建一个sqlite数据库。它一直工作到最近,我没有看到任何改变导致它失败的东西。大多数情况下,我只是更改了一些字段名称。

我在models.py中有以下内容:

    class GC_User(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        email = models.EmailField()
        wp_userID = models.PositiveSmallIntegerField(unique=True)

当我在删除旧的db文件后运行syncdb时,我获得了150行回溯,其中最后一部分是:

  File "C:\Python33\lib\site-packages\django\db\backends\util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "C:\Python33\lib\site-packages\django\db\backends\sqlite3\base.py", line 450, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: gameconapp_gc_user

有关可能导致此问题的任何想法?如果这会有所帮助,我可以提供更多的追溯。

谢谢!

更新:经过多次挖掘,我的合作伙伴确定问题是应用程序的 init.py 被调用了。由于尝试访问GC_User表的例程,它得到了没有这样的表错误。

现在我已经对它进行了评论,因此我可以运行syncdb,一旦我们正在生产中,我们将不会重置数据库,但是在我建立数据库之前初始化应用程序是违反直觉的。

4 个答案:

答案 0 :(得分:2)

我在本地SQLite 3数据库中遇到此问题。首先,我删除了文件以确定。

要解决此问题,我使用了syncdb --no-initial-data,然后继续使用migrate,其中提到的每个应用都声明未同步:

./manage.py syncdb --no-initial-data
./manage.py migrate app1
./manage.py migrate app2
./manage.py migrate app3

没有保证订单,所以必须手动完成,只需检查哪种订单适合您。在我的情况下,simple_email_confirmation应用程序必须首先完成。经过几次尝试后,./manage.py migrate本身就可以正常工作。

答案 1 :(得分:1)

由于您更改了模型中的字段名称,我假设您使用south来处理迁移。如果是这种情况:在运行迁移时,south在syncdb之前不会初始化数据库。当服务器启动时,Django会加载所有__init__models.py个文件。这些文件中需要数据库访问的任何代码都需要在try /中包装,除非它们使用south。

try:
    #code requiring database access here
except OperationalError:
    #close the database connection
    connection.close()

这样,如果出于某种原因需要再次安装新数据库,则不必再担心它。

或者,既然你的应用程序不是可重用的应用程序,那么下次你必须从头开始只需删除南迁移(只有现有数据库才需要它们)。

答案 2 :(得分:1)

虽然讨论有点陈旧,但我遇到了同样的错误,因为我使用的ChoiceFields选择需要数据库连接,例如:

class ExpenseIndividualForm(Form):
  """
  Form to get a specific expense (Individual)
  """
  date = forms.DateField(label=u"Date", initial=datetime.date.today())
  category = forms.ChoiceField(label=u"Catégorie", choices=get_individual_choices())
  employee = forms.ChoiceField(label=u"Utilisateur", choices=get_employee_choices())

函数get_individual_choicesget_employee_choice查找数据库。

当我执行manage syncdb时,它会导入类并执行初始化代码,这会导致一个非常模糊的错误。

正如arctelix所提出的,在try... except OperationalError内保护这些函数的代码可以解决问题

答案 3 :(得分:0)

由于您更改了模型中的字段,因此遇到了此错误。 该表是事先创建的,在此未更改。因此,请注释掉模型及其对应的模型,然后尝试 ./manage.py makemigrations ./manage.py迁移--fake

现在删除注释并运行

./ manage.py makemigrations ./manage.py迁移

这必须有所帮助!