我想通过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,那么最简单,最简洁(也就是说,没有搞砸现有设置)的方法是什么?谢谢。
答案 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?谢谢。