Django DecimalField ищет с MySQL не работает - PullRequest
0 голосов
/ 10 июля 2010

Я мигрирую данные из устаревшей базы данных, в которой есть много таблиц с первичными ключами, определенными как:

`id` decimal(26,0) 

Столбец id будет содержать значения, которые выглядят следующим образом:

20080313154354198004
20081217165552136057
2008080416222952067
20060510151423191000
20060510151423191000
20070710143455874025
200806239353171091

Выполнение запросов, таких как:

Release.objects.raw("SELECT id from games_release where legacy_id = 2008050812286746069")

иногда будет успешным, а иногда и неудачным. В случае сбоя я могу захватить запрос из db.connection.queries, вставить его в консоль MySQL, и запрос будет выполнен успешно. Я предполагаю, что это связано с тем, как тип DECIMAL обрабатывается на различных уровнях стека (ORM -> драйвер БД -> сервер). Казалось, что это было актуально, но мне пока не повезло с CAST ():

http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

Любая помощь в обеспечении надежной работы запросов высоко ценится.

Редактировать Одна часть головоломки, которую я забыл упомянуть: десятичные значения, по которым я пытаюсь выполнить запрос, хранятся в таблице, которая была первоначально извлечена из устаревшей таблицы. Например:

class OldModel(db.models):
    id = models.DecimalField(decimal_places=0, max_digits=36)

class NewModel(db.models):
    id = models.DecimalField(decimal_places=0, max_digits=36)

old = <some instance of OldModel>
new = NewModel.objects.create(id=old.id)

Затем, спустя некоторое время, попытка выбрать «новое» с помощью objects.raw () может завершиться неудачей.

1 Ответ

1 голос
/ 10 июля 2010

Нашел решение - приведите параметр Decimal к целому числу и используйте% s в качестве заполнителя параметра:

Release.objects.raw("SELECT id from games_release where legacy_id = %s", [int(uc.game_release_id)])
...