2013-06-20 5 views
1

장고를 통해 데이터베이스에 전화 번호 (US)를 저장하고 싶습니다. 내가 달릴 때 나는Django CharField가 MySQL에 올바르게 삽입되지 않았습니다.

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 

그래서 MySQL의 콘솔에서

python manage.py syncdb 

를했다, 나는 참조 : 세트

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'") 

내가 장고에 새로운 오전 (사용 장고 1.5 MySQL 서버 버전 : 5.1.63). 누군가 제가 명백한 실수를 지적 할 수 있다면, 나는 그것을 매우 높이 평가할 것입니다. 부수적으로, CharFieldmax_length을 15 개로 확장하고 싶다면, 가장 간단하고 깨끗한 (즉, 기존의 설정을 망쳐 놓지는 않은) 방법은 무엇입니까? 고맙습니다.

답변

0

코드에서 실수를 볼 수 없습니다. 테이블에 데이터가 없으면 demo_number 테이블을 삭제하고 syncdb를 다시 실행 해 봅니다.

테이블에 데이터가없는 경우 최대 길이 15로 변경하는 가장 쉬운 방법은 모델을 변경하고 db 셸에서 테이블을 삭제 한 다음 syncdb를 다시 실행하는 것입니다.

테이블에 데이터가있는 경우 모델을 변경 한 다음 db의 열을 업데이트 할 수 있습니다. (MySQL의 특정) 귀하의 경우 : 장고 더 복잡한 마이그레이션에 대한

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

, South를 사용합니다.

+0

감사합니다. @Alasdair. 당신이 추천 한대로, 나는 앱을 리셋 (프로세스의 모든 것을 버렸습니다)하고 작동합니다. 나는 이것을 2 시간 동안 풀려고했다는 것을 믿을 수 없다. 가능한 경우 아래의 후속 질문에 답하십시오. 다시 감사합니다! – user1330974

+0

다행니다. – Alasdair

0

@Alasdair가 맞습니다. 나는 앱을 리셋해야했다. 어떤 사람이 그것을 어떻게하는지 궁금해하는 경우 (StackOverflow를 검색했지만 관련이 있기 때문에 여기에 게시 할 수도 있음)이 https://stackoverflow.com/a/15444900/1330974은 Django> 1.3에서 작동합니다.

오류의 경우 자동 입력 ID가 증가하면 후속 질문은 입니다.예를 들어 쉘에서 이렇게했습니다.

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

예상대로 IntegrityError이 있습니다. 그래서 새 번호 시도 : 나는 MySQL의 콘솔을 확인할 때 이제

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

을, 나는 참조 : 에러가 발생했을 경우 장고 AutoField에 ID를 건너 뛸 수 있도록

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

은 정상입니까? 고맙습니다.

+0

기본 키는 열 정의에 AUTO_INCREMENT를 설정했기 때문에 데이터베이스에 의해 자동으로 설정됩니다. 전화 번호 삭제를 시작하면 '누락 된'ID가 표시됩니다. 누락 된 ID에 대해 걱정하지 마십시오. 이는 정상적인 동작입니다. – Alasdair

+0

@Alasdair 다시 한번 감사드립니다. 나는 그것을 지금 이해한다. – user1330974

관련 문제