2016-05-24 12 views
5

Sono in una situazione in cui voglio avere le chiavi di identificazione autoIncrement sui miei modelli, ma ho anche bisogno di creare infissi e relazioni tra di loro. Quando creo fixture, indico manualmente gli id ​​(in modo da non dover dipendere troppo da ordini e ipotesi che potrebbero rivelarsi sbagliati). Ma quando vado a creare più istanze (senza specificare id, lasciando autoIncrement prendere il sopravvento), ottengo collisioni con gli id ​​dalle fixture.sequelize autoIncrement id iniziale per postgres

Mi piacerebbe essere in grado di impostare il numero di incremento automatico iniziale su qualcosa come 1000 in modo da poter creare un sacco di proiettori con id scelti manualmente senza incorrere in problemi ... O c'è un altro modo per risolvere questo forse ?

risposta

0

Mi sto imbattendo nello stesso problema. Un modo per aggirarlo è lasciare "id" (autoincrementato) nelle vostre fixture, e supponendo che abbiate cancellato i dati nel vostro db, collegate le chiavi esterne (nelle vostre fixture) con quello che dovrebbe essere dopo l'autoincremento.

In questo modo, da quando hai lasciato id fuori nei dati fixture, Postgres aggiornerà la sequenza si usa per assegnare valori autoincremented per tavola di X (da X_id_seq - si può psql; \ C; \ d (alla lista DBS) ; seleziona * da X_id_seq).

Un altro modo è quello di continuare a fare ciò che si sta facendo (io e io), cioè impostare manualmente gli ID autoincrementanti e quindi modificare in qualche modo la tabella di sequenze X_id_seq per impostare il suo ultimo_valore su qualunque valore esso debba essere.

Probabilmente dovrai eseguire una query sql manuale tramite sequelize.

Un'altra opzione è quella di eseguire i propri dispositivi tramite i propri modelli. Qualcosa che stavo facendo e ora sto seriamente pensando di ritornare a ...

Edit: anche, se si sta utilizzando sequelize-infissi, si potrebbe voler dare un'occhiata al l'ultimo commento qui: https://github.com/domasx2/sequelize-fixtures/issues/43#issuecomment-147955330

Edit: problema aperto: https://github.com/domasx2/sequelize-fixtures/issues/71

Edit: Come una temperatura work-around prima di ri-scrivere tutto senza sequelize-infissi, ho usato il seguente per impostare manualmente la sequenza:

await db.sequelize.query(
    `ALTER SEQUENCE "ItemInstances_id_seq" RESTART WITH ${itemInstances.length + 1};` 
); 

io non credo che le questioniquando lo fai (prima/dopo aver caricato i proiettori) mentre stai bypassando la sequenza comunque.

Problemi correlati