Django / Python не любит значение None для FloatField - PullRequest
2 голосов
/ 29 марта 2011

У меня есть класс Account в Django с атрибутом interest_rate (соответствует account.interest_rate в моей базе данных).Вот объявление для interest_rate:

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

Если я сделаю что-то подобное, это сработает:

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

Но если я сделаю это, это не сработает:

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

Я получаю эту ошибку:

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

Почему это не позволяет мне сохранять нулевое значение в пустом поле?Я делаю это неправильно?

Ответы [ 2 ]

6 голосов
/ 29 марта 2011

Обнуляется ли поле в mysql?

Я видел эту ошибку в прошлом, когда создавал модель с полем, которое изначально не допускало обнуления, когда таблица создавалась, а затем изменялась, чтобы она могла обнуляться.Поскольку mysql имеет значение null = false, установленное при создании исходной таблицы, он не выполнит вставку, даже если django пропустит его.

Чтобы это исправить, я бы проверил определение таблицы в mysql, если поле имеет значение null= false, вы можете изменить его вручную или удалить таблицу (если вам не нужны данные), а затем повторно запустить ./manage.py syncdb для воссоздания таблицы.

Если выиспользуя south для управления миграциями схемы, вы можете создать новую миграцию схемы и затем запустить ее.

Если экземпляр таблицы mysql не показывает null = false, тогда это что-то другое.

Обновление: Мы обнаружили, что в mysql столбец имеет значение nullable, поэтому я обновляю ответ.

Я использую Django версии 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;

Вот как выглядит мой стол из mysql.

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 Мы выяснили, что он выглядит одинаково и использует примерно одинаковую версию django и python.

Какая у вас версия 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

1 голос
/ 30 марта 2011

Я неправильно строил свой SQL-запрос, вставляя пустые строки там, где должен был быть NULL. Я исправил это, и теперь он отлично работает.

Я строил запрос, который выглядел так:

INSERT INTO account (interest_rate) values ('')

Когда это должно было быть так:

INSERT INTO account (interest_rate) values (NULL)

Обе версии прекрасно работают в MySQL, но Python / Django не нравится прежняя версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...