2

10 進数フィールドを持つ Django モデルがあります。

class User(models.Model):
    ...
    balance = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    ...

開発マシン (Python 2.7.1、Mac OSX、Django 1.4、MySQL InnoDB) と実稼働サーバー (Python 2.6.5、Ubuntu、Django 1.4、MySQL ISAM) でアプリを実行しています。

問題は私の開発マシンにあります。このコードは、エラーをスローすることなく機能します。

>>> u = User.objects.get(pk=1)
>>> u.balance
Decimal('9.00')
>>> u.balance=1.44
>>> u.save()
>>> u.balance
1.44

私が理解している限り、 u.save() は次のエラーを通過する必要があります。これは、本番インスタンスで発生します。

>>> u.save()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py", line 463, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py", line 529, in save_base
    rows = manager.using(using).filter(pk=pk_val)._update(values)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 557, in _update
    return query.get_compiler(self.db).execute_sql(None)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 986, in execute_sql
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 808, in execute_sql
    sql, params = self.as_sql()
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 951, in as_sql
    val = field.get_db_prep_save(val, connection=self.connection)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/__init__.py", line 873, in get_db_prep_save
    return connection.ops.value_to_db_decimal(self.to_python(value),
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/__init__.py", line 847, in to_python
    return decimal.Decimal(value)
  File "/usr/lib/python2.6/decimal.py", line 649, in __new__
    "First convert the float to a string")
TypeError: Cannot convert float to Decimal.  First convert the float to a string

では、開発インスタンスがこのエラーをスローしないのはなぜですか? 単体テストに合格したバグのあるコードをチェックインしたため、問題が発生しました。このエラーはスローされるはずでした。これらの違いの1つが原因である必要があるため、環境の詳細を記載します。MySQL ISAM と InnoDB の違いを疑っていますが、まったく確信が持てません。

ありがとう!

4

1 に答える 1

4

Python 2.7 を実行している開発環境ではこのエラーは発生しませんが、Python 2.6 を実行している運用環境では発生するはずです。

Decimal オブジェクトの Python ドキュメントから:

バージョン 2.7 で変更: コンストラクタへの引数は float インスタンスにできるようになりました。

于 2012-09-26T08:04:11.887 に答える