Estaba leyendo sobre el documento y mencionaba dos formas de hacerlo. un postizo: findOrCreate() o upsert(). Leí las descripciones, pero todavía no tengo claro cuál es la diferencia.

El upsert() continúa diciendo:

Note that the unique index must be defined in your sequelize model and not just in the table. Otherwise you may experience a unique constraint violation, because sequelize fails to identify the row that should be updated.

¿Significa esto que upsert() requiere explícitamente que defina un campo primario id ÚNICO en mi modelo? es decir:

var Something = sequelize.define("Something", { id: { 
                    type: DataTypes.INTEGER, 
                    primaryKey: true, 
                    unique: true, 
                    allowNull: false}});

Si es así, ¿por qué findOrCreate() no tiene esa restricción?

¿Alguien puede explicar los casos de uso para cuando findOrCreate() y upsert() deben usarse, y por qué upsert() tiene el requisito de restricción única cuando findOrCreate() no parece necesitarlo?

10
fanhats 31 ene. 2015 a las 10:37

2 respuestas

La mejor respuesta

.findOrCreate consultará la base de datos con los parámetros que proporcionó, y si no hay coincidencia, realizará una operación de inserción utilizando esos mismos parámetros. Mientras que el objetivo de un .upsert es actualizar o insertar un registro. En el caso de una operación de actualización, la lógica dicta que busque un registro basado en una clave única, y solo una vez que encuentre este registro único, actualice sus valores según los parámetros proporcionados. Si no puede encontrar un registro único, solo entonces podría realizar una inserción.

Espero que tenga sentido.

19
Aᴍɪʀ 3 ene. 2017 a las 00:01

La diferencia clave es el campo Id. En caso de afirmación, necesita el campo de identificación. Pero a veces, no tiene el campo id. Por ejemplo, al crear un usuario a partir de un proveedor externo, los campos dicen fb, no tendrá la identificación del registro de usuario si ya existe. En este caso, tendrá que usar findOrCreate en uno de los campos devueltos por fb como, por ejemplo, correo electrónico. findOrCreate usuario donde el correo electrónico es el correo electrónico devuelto desde fb

1
noob7 2 jul. 2018 a las 18:40