[Python] impressioni su Django
Manlio Perillo
manlio_perillo a libero.it
Mar 14 Nov 2006 00:11:38 CET
Sandro Dentella ha scritto:
>>>> Per fortuna ti permette di definire le primary key come vuoi tu (ma non
>>>> di default, in cui vengono usate primary key surrogate).
>>> anche sqlalchemy tende a farti usare primary key surrogate, dico questo in
>>> quanto considera la PK come non modificabile. Lavoro con sqlalchemy da
>>> febbraio ed ho dovuto rivedere un po' la struttura dei miei db per poterla
>>> adattare a sqlalchemy anche se è molto ben fatto.
>>>
>> Davvero?
>> Nella documentazione non vi è menzione di questa particolarità.
>>
>> Probabilmente è una difesa preventiva contro database come MySQL e
>> SQLite che non supportano l'integrità referenziale (e quindi se cambi
>> una primary key, tutte le foreign key collegate diventano prive di
>> significato).
>>
>> Segnalalo come bug, credo che le primary key debbano essere modificabili
>> per i database dove ha senso.
>
> la sua risposta è stata:
>
> you generally shouldnt store any "information" in a primary key. primary
> keys are by definition immutable so SA would likely trip up if you change
> them. its conceivable that a feature could be added to allow updating the
> primary key columns but it would add a lot of complexity to the saving
> mechanism, to support a pattern that generally is not really correct.
>
> http://en.wikipedia.org/wiki/Primary_key
>
>
> if you want an extra "check for this condition" step its not totally
> impossible, although i dont know if I want to add assertions throughout
> the code for things like this since it will eventually chunk down the
> performance. feel free to add a ticket to Trac for a "check that primary
> key columns havent changed, raise exception" feature, id have to consider
> how non-intrusive that is.
>
Ti ha risposto velocemente!
Comunque riguardo al "pattern that generally is not really correct" ho
qualche dubbio.
A che servirebbero altrimenti i vincoli di integrità referenziale?
Dire che la primary key non dovrebbe immagazzinare nessuna informazione
porta a diversi problemi (c'è stata una discussione a riguardo anche in
it.comp.software.database).
> L'utima parte si riferisce al fatto che ignora semplicemente senza sollevare
> errori. Ora solleva errore solo se contemporaneamente campi PK *E* fai
> altro:
>
> [...]
>
Almeno un log di warning dovrebbe darlo...
>
>> A proposito: nella costruzione di una foreign key sono previste le
>> clausole on update/on delete, (not) deferrable, initially
>> immediate/deferred?
>
> mi pare che siano state recentemente inserite (in SA, nonso in Django)
>
Django non credo lo farà mai ;-).
>> E' possibile creare indici parziali con PostgreSQL?
> ovvero?
>
>
CREATE INDEX access_log_client_ip_ix ON access_log (client_ip)
WHERE NOT (client_ip > inet '192.168.100.0' AND client_ip < inet
'192.168.100.255');
In pratica crea l'indice solo dove decidi tu.
Non che le abbia mai usate.
Sono solo curioso di sapere quanto sqlalchemy è flessibile per adattarsi
alle feature dei vari database (per non parlare della gestione delle
transazioni).
Sono convinto che l'idea di avere una implementazione unica per diversi
database è una illusione, e funziona solo se si usa il database ai
minimi termini (ma spesso, in effetti, è così nell'85% dei casi credo).
Saluti Manlio Perillo
Maggiori informazioni sulla lista
Python