2011-03-29 4 views
2

Account 클래스는 장고에 interest_rate 속성 (내 데이터베이스에 account.interest_rate에 해당)이 있습니다.Django/Python에서 싫어함 FloatField에 대한 없음 값

account = Account() 
account.interest_rate = 5 
account.save() 

하지만 이렇게하면, 그것은 작동하지 않습니다 :

interest_rate = models.FloatField(null=True, blank=True) 

나는 같은 것을 할 경우, 작동 :

account = Account() 
account.interest_rate = None 
account.save() 

I를 여기 interest_rate에 대한 선언이다 이 오류가 발생합니다 :

Traceback (most recent call last): 
    File "./import.py", line 18, in <module> 
    cProfile.run('g.process()', 'prof') 
    File "/usr/lib/python2.6/cProfile.py", line 29, in run 
    prof = prof.run(statement) 
    File "/usr/lib/python2.6/cProfile.py", line 135, in run 
    return self.runctx(cmd, dict, dict) 
    File "/usr/lib/python2.6/cProfile.py", line 140, in runctx 
    exec cmd in globals, locals 
    File "<string>", line 1, in <module> 
    File "/home/jason/projects/mcifdjango/mcif/models/generic_import.py", line 34, in process 
    Account.save_in_bulk(self.rows) 
    File "/home/jason/projects/mcifdjango/mcif/models/account.py", line 45, in save_in_bulk 
    cursor.execute(Account.bulk_insert_statement(rows)) 
    File "/usr/lib/pymodules/python2.6/django/db/backends/util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/lib/pymodules/python2.6/django/db/backends/mysql/base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 168, in execute 
    if not self._defer_warnings: self._warning_check() 
    File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 82, in _warning_check 
    warn(w[-1], self.Warning, 3) 
_mysql_exceptions.Warning: Data truncated for column 'interest_rate' at row 1 

nullable 필드에 널을 저장할 수없는 이유는 무엇입니까? 내가 잘못하고 있니?

답변

1

내가 널 (null)을 가하고해야 어디 빈 문자열을 넣어, 잘못 내 SQL 쿼리를 구축했다. 나는 그것을 고쳤고 이제는 잘 동작한다.

INSERT INTO account (interest_rate) values ('') 

가 있었어야 할 때 :

INSERT INTO account (interest_rate) values (NULL) 

두 버전의 MySQL하지만 파이썬/장고에서 잘 작동이 마음에 들지

나는이처럼 보였다 쿼리를 작성했다 이전 버전.

+0

답을 찾은 것을 기쁘게 생각합니다. 당신이 원래의 질문을 당신이 잘못했는지, 그리고 당신의 수정이 무엇인지를 사람들이 당신이 어떻게 고쳐 주는지 볼 수 있도록 업데이트 할 수 있습니까? –

6

필드는 mysql에서 nullable입니까?

원래 테이블이 만들어 질 때 나중에 nullable이 될 수 있도록 허용되지 않은 필드가있는 모델을 만들 때이 오류가 발생했습니다. mysql은 원래 테이블 생성에서 null = false 집합을 가지고 있기 때문에 django가 처리 할 수 ​​있다고하더라도 삽입이 실패합니다.

이 문제를 해결하려면 mysql의 테이블 정의를 확인하십시오. 필드가 null = false이면 수동으로 변경하거나 테이블을 삭제할 수 있습니다 (데이터를 신경 쓰지 않는다면). 그런 다음 ./manage.py syncdb를 다시 실행하여 테이블을 다시 작성하십시오.

스키마 마이그레이션을 관리하기 위해 south를 사용하는 경우 새 스키마 마이그레이션을 만든 다음이를 실행할 수 있습니다.

mysql 테이블 인스턴스에 null = false가 표시되지 않으면 다른 것입니다.

업데이트 : 우리는 mysql에 nullable이라는 열이 있음을 알았습니다. 따라서 대답을 업데이트하고 있습니다.

나는 장고 버전 1.2.5를 사용하고 있습니다. 어떤 버전을 사용하고 있습니까?

나는 내 시스템에서 모델을 만들었습니다.

from django.db import models 

#================================================================================ 
class Account(models.Model): 
    interest_rate = models.FloatField(null=True, blank=True) 

그런 다음 쉘을 통해 실행하면 저에게 효과적입니다.

Python 2.6.6 (r266:84292, Sep 8 2010, 16:19:33) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from aggra.models import Account 
>>> account = Account() 
>>> account.interest_rate = None 
>>> account.save() 
>>> exit() 

다음은 django의 작성 문입니다. aggra이 내 앱 이름입니다.

$ python manage.py sql aggra 
BEGIN; 
CREATE TABLE `aggra_account` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    `interest_rate` double precision 
) 
; 
COMMIT; 

다음은 내 테이블의 모습입니다.

CREATE TABLE `aggra_account` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `interest_rate` double DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 

너처럼 보이나요?

업데이트 2 우리는이 같은 모습, 그리고 약 장고와 파이썬의 동일한 버전을 사용하는 것을 발견 .

귀하의 MySQL 버전은 무엇입니까?

SQL 모드에는 어떤 것이 있습니까? 내 것이 비어있다. 당신이 엄격하게 설정하는 경우

mysql> show variables where Variable_name = 'sql_mode'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| sql_mode  |  | 
+---------------+-------+ 
1 row in set (0.00 sec) 

, 당신은 더 엄밀하게 변경해야합니다.

http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html

도 참조하십시오.

http://forums.mysql.com/read.php?11,132672,132693#msg-132693

+0

이 열은 MySQL에서는 null입니다. –

+0

철저한 조사에 감사드립니다. 나는 Django 1.2.3, Python 2.6.6을 사용 중이다. 'SHOW CREATE TABLE'을 실행하면'interest_rate'에 대해'interest_rate' float DEFAULT NULL'이 표시됩니다. 보시다시피, double과 반대되는 float입니다 (아마도 많은 의미를 가지지는 않지만 그게 내가 사용하고있는 것입니다). 아마도 나는 두 배를 시도 할 것입니다. –

+0

@Jason Swett, 제 생각에는 MySQL 서버 설정일지도 모릅니다. 내 대답을 참조하십시오. sql_mode 및 mysql의 sql_mode 페이지에 대한 참조를 업데이트하여 값을 변경하고 도움이되는지 확인할 수있는 방법으로 업데이트했습니다. –

관련 문제