2012-12-22 22 views
8

Jestem nowy na sequelize i Node.js.
Kodowanie dla kontynuacji testu, ale wystąpił błąd "ER_NO_SUCH_TABLE: Tabela" test_db.node "nie istnieje"
Błąd jest bardzo prosty.
Jednak chcę uzyskać dane z tabeli "node_test".
Myślę, że sequelize dołącza "charakter".sequelize dla Node.js: ER_NO_SUCH_TABLE

Istnieje mój kod źródłowy.

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); 
    }); 

Już utworzyłem tabelę "test_węzła" i wstawiłem dane za pomocą klienta mysql.

Czy źle rozumiem użycie?

+0

Używam Mysql 5.5.28/sequelize 1.6.0-beta4/Node.js 0.8.15. –

Odpowiedz

9

Znalazłem odpowiedź na własne pytanie.

Dodałem opcję Sequelize następującą po opcji. {define:{freezeTableName:true}}

Następnie kontynuuj dodawanie znaku "nie dołącza" po nazwie tabeli.

3

Sequelize używa domyślnie liczby mnogiej podanej nazwy modelu. Będzie więc szukać tabeli "node_tests" lub "NodeTests". Jeśli chcesz, możesz utworzyć dla siebie stół.

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

Synchronizacja spróbuje utworzyć tabelę, jeśli jeszcze nie istnieje. Możesz również upuścić istniejącą tabelę i utworzyć nową od podstaw, używając sync({ force: true }). Sprawdź polecenia SQL w wierszu poleceń, aby dowiedzieć się więcej o tym, co się dzieje.

+0

Dziękujemy za pomocną odpowiedź. :) –

+0

nie ma za co. daj mi znać, jeśli potrzebujesz więcej informacji. – sdepold

+0

tylko z boku: moduł 'dresende/node-orm2' dał mi to samo' Błąd: ER_NO_SUCH_TABLE' ... po raz pierwszy musisz wywołać 'sync()', zanim dodasz dane. –

2

Choć odpowiedź działa ładnie, ja obecnie zaleca się stosowanie opcji tableName podczas deklarowania model:

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

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

+1

Dziękujemy za nową odpowiedź. Spróbuję tego. :) –

+0

@sdepold Możesz zaktualizować link do dokumentacji. –

1

Po zdefiniowaniu modelu do istniejącą tabeli, musisz ustawić dwie opcje: w celu kontynuacji:

  1. znaleźć nazwę tabeli jak jest i
  2. nie niepokoić się o domyślnych kolumn sequelize za updatedAt i createdAt że oczekuje.

Wystarczy dodać obie opcje tak:

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

zanotować opcji parametr:

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

Brakujące albo opcje wyzwala odpowiednie błędy przy stosowaniu metod sequelize takie jak nodeTest. findAll().

> ER_NO_SUCH_TABLE //freezeTableName 
> ER_BAD_FIELD_ERROR //timestamps 

Alternatywnie można:

  1. utworzyć nową tabelę poprzez sequelize. Doda on "s" do nazwy tabeli i utworzy dwie kolumny datownika jako domyślne lub
  2. użyć sequelize-auto, niesamowitego pakietu npm do generowania sekwencyjnie modeli z istniejącej bazy danych programowo.

Oto kolejna wersja documentation dla konfiguracji opcjonalnych.