SQLObject
Iñigo Serna
inigoserna en gmail.com
Dom Jul 2 14:38:09 CEST 2006
[buenas, lo envío ahora desde la dirección de email con la que estoy
suscrito ;-]
Buenas,
perdón si llego tarde al mensaje...
El "id" en SQLObject es un campo "interno" y *siempre*
autoincremental, da lo mismo que le cambies de nombre con el truco del
"sqlmeta".
Entiendo que lo que tú necesitas es que el campo "dni" sea una clave,
pero no primaria, para ello créalo como si fuera cualquier otro campo
normal y añádele lo de AlternateID=True.
De la documentación:
"""
If you use alternateID=True, this means that the column uniquely
identifies rows -- like a username uniquely identifies a user. This
identifier is in addition to the primary key (id), which is always
present.
Note
SQLObject has a strong requirement that the primary key be unique and
immutable. You cannot change the primary key through SQLObject, and if
you change it through another mechanism you can cause inconsistency in
any running SQLObject program (and in your data). For this reason
meaningless integer IDs are encouraged -- something like a username
that could change in the future may uniquely identify a row, but it
may be changed in the future. So long as it is not used to reference
the row, it is also safe to change it in the future. """
Yo definiría la clase como:
class usuario(SQLObject):
dni = StringCol(alternateID=True, length=9)
nombre = StringCol()
rol = ForeignKey('rol')
NOTA: length = 9 ó 8 dependiende si el campo dni incluye la letra del NIF o no.
Esto hace que "dni" sea clave no primaria, no autoincrementa, facilita
búsquedas, obliga a que no sea nulo, etc.
Es decir, que se puede hacer cosas como:
>>> u1 = Usuario.byDni('12345678A')
y, por cierto, que el error que se menciona en u email anterior es tal
vez porque se define dni como StringCol y luego se le pasa un int en
vez de un string.
Espero que hay sido de ayuda.
Un saludo,
Iñigo Serna
PD: por cierto, que es mi primer mensaje a la lista
El mar, 27-06-2006 a las 19:59 -0400, Luis Miguel Morillas escribió:
2006/6/27, marcelo schiavone <marcelo.schiavone en gmail.com>:
> > Gracias Luis, pero probe esto que me has dicho y genera un campo "dni"
> > y otro "id", el cual es la clave primaria auto-incremental. Mi idea es
> > que "dni" sea la clave primaria y que no sea auto-incremental.
> >
>
> Tienes razon. Acabo de leerlo en la documentacion:
> If you use alternateID=True, this means that the column uniquely
> identifies rows -- like a username uniquely identifies a user. This
> identifier is in addition to the primary key (id), which is always
> present.
>
> Y si combinas las dos: alternateID y idName ?
>
> > Saludos
> >
> >
> > On 6/27/06, Luis Miguel Morillas <morillas en gmail.com> wrote:
> > > 2006/6/27, marcelo schiavone <marcelo.schiavone en gmail.com>:
> > > > Hola, alguien sabe como hacer para que el idName no sea auto-incremental.
> > > > Ejemplo:
> > > > class usuario(SQLObject):
> > > > class sqlmeta:
> > > > idName="dni"
> > > > nombre=StringCol()
> > > > rol=ForeignKey('rol')
> > >
> > > class usuario(SQLObject):
> > > dni = StringCol(alternateID=True)
> > > nombre = StringCol()
> > > rol = ForeignKey('rol')
> > >
> > >
> > >
> > > >
> > > > para agregar un usuario tengo que hacer:
> > > > usuario(nombre="nombre usuario", rol=None)
> > > >
> > > > porque si quiero poner el DNI de esta manera:
> > > > usuario(dni=32894, nombre="nombre usuario", rol=None)
> > > > larga el siguiente error:
> > > > usuario.set() got an unexpected keyword argument dni
> > > >
> > > > Saludos
Más información sobre la lista de distribución Python-es