2

我正在运行 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 表,它得到了 no such table 错误。

现在我已经把它注释掉了,这样我就可以运行syncdb了,一旦我们投入生产,我们就不会重置数据库,但是在设置数据库之前初始化应用程序对我来说是违反直觉的。

4

4 回答 4

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它自己应该可以工作。

于 2014-08-24T11:34:20.573 回答
1

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

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

这样,如果由于某种原因您需要再次安装新的数据库,您就不必再担心它了。

或者,由于您的应用程序不是可重用的应用程序,因此下次您必须从头开始时,只需删除南迁移(仅现有数据库需要它们)。

于 2014-03-11T21:56:44.937 回答
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解决了这个问题

于 2014-06-26T21:12:36.810 回答
0

由于您更改了模型中的字段,因此您遇到了此错误。该表是事先创建的,在那里没有更改。因此,注释掉模型及其对应的模型并尝试 ./manage.py makemigrations ./manage.py migrate --fake

现在删除评论并运行

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

这必须有帮助!

于 2019-02-27T20:31:34.330 回答