2011-09-20 55 views
5

我正在将来自php应用程序的MySQL数据库集成到新的Django项目中。 Inspectdb运行良好,我只需要将几个字段更改为ForeignKeys,现在所有读取和编辑当前数据的工作都很好。Django - 遗留数据库和'id'字段的问题

问题是当我尝试创建新条目时,出现错误"Field 'id' doesn't have a default value"。回溯从form.save()调用开始,异常来自MySQL光标。在大多数情况下,列被命名为id但在一个情况下,它是一个名为值:

class ModelOne(models.Model): #normal "id" named pk 
    id = models.AutoField(primary_key=True, db_column='id', default=None) 
    other_fields = ... 

class ModelTwo(models.Model): #specific pk 
    named_pk = models.AutoField(primary_key=True, db_column='named_pk', 
           default=None) 
    other_fields = ... 

对于ModelTwo,当我发布一个有效的形式,我得到的错误,但以后我回到我的数据列表,新项目显示!在我检查了shell中最新的id值后,我可以看到它们正在递增。

但是对于ModelOne(只有id),错误仍然显示,并且pk变为2147483647(最大值),并且后续保存由于重复的id而失败。 (下一个最高PK只有62158)

我需要做些什么才能让这些ID字段正常工作?


更新:仍然没有运气修复此。考虑转储数据并将其导入新的,Django构建的表格。仍在寻找解决这个问题的办法。


UPDATE2:从数据库外壳 信息

ModelOne:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 

ModelTwo:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| named_pk | int(11)  | NO | PRI | NULL | auto_increment | 
+0

如果删除了'默认会发生什么=无'? –

+0

@Daniel Roseman - 同样的事情。我只是试图直接解决错误指向的错误 –

回答

1

我结束了从原始数据库导出数据从模型和默认NULL,并将其加载到一个新的数据库,其是由我的模型/项目生成的。

我想我已经尝试了太多的事情,我正在处理原始数据库的副本,并且搞砸了底层SQL的pk字段。

我很高兴我只用了一份副本。

+0

同样的事情发生在我身上,同样的问题。数据导出,然后重新创建表允许django设置mysql自动增量属性,正确地将新pk的生成委托给mysql。 – hobs

3

这是有道理的定义PK的ModelTwo(因为你已经在做),因为你的pk有不同的名字'named_pk'。但是,不需要明确定义'id'作为ModelOne的pk。 Django默认会创建id列。因此,不要为ModelOne定义id列。

UPDATE:删除“默认值=无”从数据库ModelTwo为named_pk

+0

我也试过这种方法。如果我进入SQL并查看能力结构,那么已经有一个设置为auto_increment的“id”列。我认为问题在于Django认识到它。尽管它实际上保存了正确的数据,但为什么ModelTwo出现错误? –

+0

我更新了我的问题,以显示'SHOW COLUMNS FROM table_name'的MySQL输出。我并不完全遵循你所说的话,ModelTwo没有名为'id'的列。字段'named_pk'一直是PK专栏。对于该模型,'named_pk'的实际值非常重要(它与购买系统中的连续订单号相关)。 –

+0

如果ModelTwo表中没有'id'列,那么保存ModelTwo时会出现什么错误? –

5

经过一些复杂的南迁移之后,我遇到了同样的问题。 我们希望避免重新加载数据库(转储/导入),幸运的是,它会在搜索相同问题后帮助其他人员落在此帖子上。

我们发现了一个解决方案,无需导出和导入数据库即可解决此问题。

对于表命名AUTH_USER,下面的MySQL命令将定势上述错误消息:

ALTER TABLE auth_user MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT; 

从原来的解决方案:

http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/

+0

+1这对我有用。 –