Django CharField没有在MySQL中正确插入

时间:2013-06-20 22:06:39

标签: django django-models

我想通过Django将电话号码(美国)保存在数据库中。我有

from django.db import models
    class Number(models.Model):
        phone_number = models.CharField("Phone Number", max_length=10, unique=True)

我跑的时候:

python manage.py sql myapp

我得到了

BEGIN;
CREATE TABLE `demo_number` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`phone_number` varchar(10) NOT NULL UNIQUE
)
;

当我验证它时,没有错误。

python manage.py validate
0 errors found

所以我做了

python manage.py syncdb

在MySQL控制台中,我看到:

mysql> select * from myapp_number;
Empty set (0.00 sec)
mysql> describe myapp_number;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| phone_number | varchar(10) | NO | UNI | NULL | |
+--------------+-------------+------+-----+---------+----------------+

2行(0.03秒)`

然后在python manage.py shell,我做

from demo.models import Message, Number, Relationship, SmsLog
n=Number(phone_number='1234567890')
n.save()

当我再次检查MySQL控制台时,我看到:

mysql> select * from myapp_number;
+------------+--------------+
| id | phone_number |
+------------+--------------+
| 2147483647 | 1234567890 |
+------------+--------------+
1 row in set (0.01 sec) 

为什么id是一个很大的数字?事实上,因为我不能再插入电话号码了。例如,在python manage.py shell

n=Number(phone_number='0987654321')
n.save()

IntegrityError: (1062, "Duplicate entry '2147483647' for key 'PRIMARY'")

我是Django的新手(使用Django 1.5和MySQL Server版本:5.1.63)。如果有人能指出我正在犯的明显错误,我会非常感激。另外,如果我想将max_length的{​​{1}}扩展到15,那么最简单,最简洁(也就是说,没有搞砸现有设置)的方法是什么?谢谢。

2 个答案:

答案 0 :(得分:0)

我在代码中看不到任何错误。如果表中没有任何数据,我会尝试删除demo_number表并再次运行syncdb。

如果表中没有任何数据,更改为最大长度15的最简单方法是更改​​模型,将表删除到db shell中,然后再次运行syncdb。

如果表中有数据,则可以更改模型,然后更新数据库中的列。在您的情况下(特定于MySQL):

ALTER TABLE demo_number CHANGE phone_number phone_number varchar(15) NOT NULL UNIQUE;

对于Django中更复杂的迁移,请使用South

答案 1 :(得分:0)

原来@Alasdair是对的。我不得不重置应用程序。如果有人想知道如何做(我在StackOverflow中搜索,但也可能在此处发布,因为它是相关的),这个https://stackoverflow.com/a/15444900/1330974将适用于Django> 1.3。

如果出现错误时AutoField ID增加,我的后续问题是。例如,我在shell中执行了此操作:

from demo.models import Number
n=Number(phone_number='1234567890')
n.save()
n=Number(phone_number='1234567890')
n.save()

按预期获得IntegrityError。所以试试一个新号码:

n=Number(phone_number='0987654321')
n.save()

现在,当我查看MySQL控制台时,我看到了:

mysql> select * from demo_number;
+----+--------------+
| id | phone_number |
+----+--------------+
| 3 | 0987654321 |
| 1 | 1234567890 |
+----+--------------+
2 rows in set (0.00 sec) 

如果出现错误,Django是否正常跳过AutoField中的ID?谢谢。