2013-06-04 3 views
1

i ont une table qui a une colonne « tasse » table à l'intérieur « café »Python possible Sqlite3 Bug

update coffee set cup=cup||'test_add' 

ceci ne provoque une erreur, mais il ne marche pas ajouter la chaîne « test_add » à la colonne! aussi, la valeur dans la coupe de la colonne est actuellement rien. cela m'a pris pour toujours que vous ne pouvez pas utiliser cette syntaxe en ajoutant du texte lorsque la colonne n'a aucune valeur. cela ne fait pas de sens pour moi parce que la colonne est définie comme une colonne de texte et il n'a pas de valeur, il me semble équivalent à la

a="" 
a+="test_add" 

et cela fonctionne de syntaxe. d'autre part si c'est

a=None 
a+="test_add" 

il lance une erreur. donc il me semble que le code que je mets tout en haut devrait soit ajouter le texte ou lancer une erreur !!!

Répondre

1

En SQL, faire à peu près n'importe quoi avec NULL vous donne NULL de retour. En particulier, ceci:

NULL || 'test_add' 

est NULL. Vous dites que la colonne cup n'a aucune valeur, que, avec les symptômes que vous décrivez, cela signifie que cup IS NULL est vrai. Donc, votre cup || 'test_add' ajoute réellement votre chaîne à la valeur de la colonne, le problème est que NULL || any_string_you_want est NULL.

Si vous voulez traiter NULL comme une chaîne vide, puis utilisez COALESCE:

soudent (X, Y, ...) Fonction

COALESCE() retourne une copie de son premier argument non-NULL, ou NULL si tous les arguments sont NULL. Coalesce() doit avoir au moins 2 arguments.

Alors vous feriez quelque chose comme ceci:

update coffee set cup = coalesce(cup, '') || 'test_add' 

Python et SQL sont des langues différentes, vous ne devriez pas attendre Python None à se comporter comme de NULL SQL. Vous ne voyez pas de bogue, vous ne voyez que le comportement standard de NULL (qui ressemble souvent à un bogue quand vous n'êtes pas habitué, mais c'est une autre histoire).

+0

oh oups, merci je suis nouveau à sql (et python) qui l'explique parfaitement – appleLover

+0

@appleLover: Ne vous sentez pas mal, NULL jette tout le monde pour une boucle au début. –