2012-12-22 13 views
8

Sono nuovo per sequelize e Node.js.
Ho codificato per il test sequelize, ma si è verificato un errore "ER_NO_SUCH_TABLE: tabella 'db.node_tests' non esiste"
L'errore è molto semplice.
Tuttavia, desidero ottenere i dati dalla tabella "node_test".
Penso che sequelize appende 's' carattere.sequelize per Node.js: ER_NO_SUCH_TABLE

C'è il mio codice sorgente.

var Sequelize = require('sequelize'); 

var sequelize = new Sequelize('db', 'user', 'pass'); 
var nodeTest = sequelize.define('node_test', 
     { uid: Sequelize.INTEGER 
     , val: Sequelize.STRING}); 

nodeTest.find({where:{uid:'1'}}) 
    .success(function(tbl){ 
     console.log(tbl); 
    }); 

Ho già creato la tabella "node_test" e inserito i dati utilizzando il client mysql.

Ho frainteso l'utilizzo?

+0

Sto usando Mysql 5.5.28/sequelize 1.6.0-beta4/Node.js 0.8.15. –

risposta

9

Ho trovato la risposta alla mia domanda.

Ho aggiunto l'opzione di metodo Sequelize seguente. {define:{freezeTableName:true}}

Quindi sequelize non appende il carattere dopo il nome della tabella.

3

Sequelize utilizza per impostazione predefinita il plurale del nome del modello passato. Quindi cercherà la tabella "node_tests" o "NodeTests". Inoltre può creare il tavolo per te se lo desideri.

nodeTest.sync().success(function() { 
    // here comes your find command. 
}) 

Sync proverà a creare la tabella se non esiste già. È inoltre possibile eliminare la tabella esistente e crearne una nuova da zero utilizzando sync({ force: true }). Controlla i comandi SQL sulla tua riga di comando per maggiori dettagli su cosa sta succedendo.

+0

Grazie per la tua utile risposta. :) –

+0

sei il benvenuto. fammi sapere se hai bisogno di ulteriori informazioni. – sdepold

+0

solo un lato: il modulo 'dresende/node-orm2' mi ha dato lo stesso' Errore: ER_NO_SUCH_TABLE' ... è necessario chiamare 'sync()' per la prima volta, prima di aggiungere dati. –

2

Anche se la risposta funziona bene, vi consiglio al giorno d'oggi l'uso dell'opzione tableName quando dichiara il modello:

sequelize.define('node_test', { 
    uid: Sequelize.INTEGER, 
    val: Sequelize.STRING 
}, { 
    tableName: 'node_test' 
}); 

http://sequelizejs.com/documentation#models-configuration

+1

Grazie per la tua nuova risposta. Lo proverò. :) –

+0

@sdepold È possibile aggiornare il collegamento alla documentazione. –

1

Quando si definisce un modello a un tabella esistente, è è necessario impostare due opzioni per il sequelize a:

  1. trovare il tuo nome della tabella così com'è e
  2. non preoccuparsi di colonne predefinite di sequelize updatedAt e createdAt che si aspetta.

Basta aggiungere entrambe le opzioni in questo modo:

var nodeTest = sequelize.define('node_test', 
     { uid: Sequelize.INTEGER , val: Sequelize.STRING}, 
     { freezeTableName: true , timestamps: false} //add both options here 
); 

Annotare il opzioni parametro:

sequelize.define('name_of_your_table', 
    {attributes_of_your_table_columns}, 
    {options} 
    ); 

mancante sia opzioni innesca rispettivi errori quando si utilizzano metodi sequelize quali nodeTest. findAll().

> ER_NO_SUCH_TABLE //freezeTableName 
> ER_BAD_FIELD_ERROR //timestamps 

In alternativa, è possibile:

  1. creare una tabella fresca attraverso sequelize. Aggiungerà "s" al nome della tabella e creerà due colonne timestamp come valori predefiniti o
  2. utilizza sequelize-auto, un fantastico pacchetto npm per generare sequenze di modelli dal database esistente a livello di codice.

Ecco il sequelize documentation per le configurazioni di opzioni.