2014-01-10 42 views
2

我正在运行syncdb来创建一个sqlite数据库。它一直工作到最近,我没有看到任何我已经改变的东西,这会导致它失败。大部分我只是改变了一些字段名称。OperationalError:在syncdb上没有这样的表

我已在在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) 

当我删除旧的数据库文件运行后执行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,一旦我们在生产中,我们不会重置数据库,但它对我来说是违反直觉的,即应用程序在数据库设置之前被初始化向上。

+0

您可以在'try/except'内初始化您的应用程序,并在数据库表尚未设置时自动失败。所以你不需要考虑取消对生产变化的评论 – Thomas

回答

1

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

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

这样,如果由于某种原因需要再次安装新的数据库,您不必再担心它。或者,因为你的应用程序不是可重用的应用程序,所以下次你必须从头开始,只需要删除南迁移(它们只对现有数据库是必需的)。

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查找到数据库:

+0

我对南方并不熟悉,我一直主要通过大量的试验和错误的文档来教我自己。这听起来很有用。 我在init.py中放入的代码实际上并不需要在每次启动时运行,所以我将它放在经理或管理员可以明确运行的任务菜单上。 –

+0

@BeverlyBlock已经有一段时间了,没有看到您的评论。当你想改变模型字段而不必重新设置你的数据库时,South会发挥作用。它将迁移现有的数据库以匹配新的字段。它非常易于使用,并将在下一个版本中成为django的一部分,所以一定要开始使用它。 – arctelix

1

虽然讨论的是有点老了,我是因为我是用了哪些选择需要一个数据库连接ChoiceFields,例如有同样的错误。

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

提议arctelix,保护这些功能的代码中try... except OperationalError解决问题

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本身应该工作。

相关问题