2010-07-10 4 views
0

Je migration des données à partir d'une base de données existante qui a de nombreuses tables avec des clés primaires définies comme:lookups Django DecimalField avec MySQL ne fonctionne pas

`id` decimal(26,0) 

La colonne id contiennent des valeurs qui ressemblent à:

20080313154354198004 
20081217165552136057 
2008080416222952067 
20060510151423191000 
20060510151423191000 
20070710143455874025 
200806239353171091 

requêtes faire comme:

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

réussiront parfois et parfois échouer. En cas d'échec, je peux capturer la requête de db.connection.queries, la coller dans la console MySQL et la requête va aboutir. J'imagine qu'il doit avec la façon dont le type DECIMAL est géré aux différents niveaux de la pile (ORM -> DB driver -> serveur). Cela semblait comme il était pertinent, mais je n'ai pas eu de chance avec CAST() jusqu'à présent:

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

Toute aide à rendre les requêtes fonctionner de manière fiable beaucoup apprécié.

Modifier Une pièce du puzzle que j'oublié de mentionner: Les valeurs décimales que je tente d'interroger sur sont stockés dans une table qui ont été initialement tiré de la table de l'héritage. Par exemple:

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) 

Ensuite, en essayant de sélectionner pour "nouveau" via objects.raw() peut échouer.

Répondre

1

trouvé une solution - cast le paramètre décimal à un entier et utiliser% s comme l'espace réservé param:

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

Vous devez accepter votre réponse afin que d'autres connaissent une solution a été trouvée. – Mike

+0

Fait, merci. StackOverflow impose un temps d'attente en acceptant vos propres réponses ou je l'aurais fait plus tôt :) –

Questions connexes