[Python] impressioni su Django
Sandro Dentella
sandro a e-den.it
Lun 13 Nov 2006 23:31:45 CET
> >> 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.
L'utima parte si riferisce al fatto che ignora semplicemente senza sollevare
errori. Ora solleva errore solo se contemporaneamente campi PK *E* fai
altro:
from sqlalchemy import *
eng = create_engine("sqlite://", echo=False)
session = create_session()
users = Table('users', eng,
Column('user_name', String(30), nullable = False,
primary_key = True),
Column('user_last_name', String(30), nullable = False))
users.create()
users.insert().execute(
{'user_name': 'Sam', 'user_last_name': 'Patts'},
{'user_name': 'Sid', 'user_last_name': 'Watts'},
)
class User(object): pass
m = mapper(User, users)
u = session.query(m).select()[1]
#u = m.select()[1]
eng.echo = True
u.user_name = 'Sandro'
u.user_last_name = 'Dentella'
session.flush()
> 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)
> E' possibile creare indici parziali con PostgreSQL?
ovvero?
--
Sandro Dentella *:-)
http://www.tksql.org TkSQL Home page - My GPL work
Maggiori informazioni sulla lista
Python