sql >> Base de Datos >  >> RDS >> PostgreSQL

Sqlalchemy y PostgreSql:¿cómo configurar la clave principal manualmente sin conflictos en el futuro?

No conozco ninguna forma segura y eficiente de hacer lo que quieres. Realmente debería elegir si desea definir las claves usted mismo o usar claves generadas y ceñirse a una estrategia u otra.

Si no le importa la terrible concurrencia, puede LOCK TABLE thetable , haz tu trabajo, setval la secuencia del identificador de la tabla al siguiente valor libre después de lo que insertó, y commit para liberar la cerradura. Sin embargo, eso seguirá causando problemas con las aplicaciones que llaman explícitamente a nextval (como muchos ORM) en lugar de dejar que la base de datos defina el valor al omitirlo del ?INSERT lista de columnas o nombrándola explícitamente como DEFAULT .

De lo contrario, podría hacer que su código (o una función de ayuda de PL/PgSQL) haga la inserción en un bucle de reintento que incrementa la clave y vuelve a intentarlo cuando obtiene un error de integridad. Esta estrategia no funcionará si necesita hacer más que solo una inserción por transacción. Además en SERIALIZABLE modo de aislamiento No creo que pueda hacerlo con PL/PgSQL, debe usar un ciclo de reintento del lado del cliente para manejar las fallas de serialización.

Es una idea terrible. Utilice claves definidas por la aplicación de forma coherente o claves definidas por la base de datos de forma coherente. No mezcles los dos.