Pregunta

Actualmente estoy evaluando frameworks web con una capa ORM y me topé con un tema interesante.Utilicé tablas con una columna de ID en una aplicación Java EE (EJB3/JPA) con diferentes bases de datos.En SAPDB podría definir una secuencia y usar la anotación del generador de secuencias jpa para manejarla, de la misma manera que lo hice anteriormente en una base de datos Oracle.Cuando cambié a SQL Server 2005, de repente tuve que reemplazar todo por una anotación IDENTIDAD porque aparentemente así es como SQL Server maneja la generación de identificación.Me decepcionó un poco que JPA no me diera una abstracción superior a eso y supongo que no es la única limitación con la que me encontraré al usar diferentes bases de datos.

Ahora a mi pregunta:Leí que en web2py, por ejemplo, todas las tablas deben modificarse para usar un índice de incremento automático.¿Admite también generadores de secuencias o columnas de identidad?¿Qué pasa con los otros marcos web?¿Me permitirán trasladar mi aplicación a múltiples bases de datos heredadas?Es decir, las definiciones de la tabla son las mismas excepto por la columna de identidad y las ligeras diferencias entre la definición del tipo de datos para Cadenas (recuerdo haber alterado las declaraciones de creación allí, pero no recuerdo qué era exactamente necesario)

También hay una diferencia en la obtención del ID: con el generador de secuencia puedes acceder al ID generado antes de la confirmación, con auto_increment en MySQL, afaik, no puedes.

¿Fue útil?

Solución

SQLAlchemy puede manejar ambos sentidos bien. Dada una declaración de esquema siguiente:

class Foo(Base):
    id = Column(Integer, Sequence('foo_seq', optional=True), primary_key=True)
    ...

SQLAlchemy utilizará el construido en el paradigma de incremento automático de la base de datos si tiene uno, de lo contrario será definir una secuencia. También gestiona el ir a buscar el identificador generado, pero a medida que la API es mínimo común denominador es obvio que no se puede acceder a ella antes de la inserción. Se puede recuperar por supuesto el ID manualmente si lo desea. Por ejemplo, para PostgreSQL que tiene secuencias, pero también tiene un tipo de datos serial incremento automático que está respaldado por secuencias, este utilizará el tipo de datos serial. Con las versiones más antiguas se precapturar automáticamente el siguiente valor de secuencia para utilizar en la pieza de inserción, con SQLAlchemy 0,6 serie y Postgres 8.3+ que utilizará la función de INSERT ... RETURNING ... insertar y ha podido recuperar de una sola vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top