Definindo Modelos com Sequelize no Node.js
Um componente chave ao trabalhar com o Sequelize e bancos de dados são os modelos. Eles descrevem a estrutura dos dados armazenados no banco de dados e são o principal meio de interação com o banco.
Existem duas maneiras de definir modelos. A primeira envolve o uso do método define()
User
const User = sequelize.define("user", {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false
},
name: {
type: Sequelize.STRING,
allowNull: false
},
age: {
type: Sequelize.INTEGER,
allowNull: false
}
});
O primeiro parâmetro do método é o nome do modelo. Nesse caso, o modelo é chamado "user". É importante observar que, se não existir uma tabela correspondente a esse modelo no banco de dados, ela será criada automaticamente. O nome da tabela será o nome do modelo no plural, conforme as regras da língua inglesa. Portanto, neste exemplo, a tabela será chamada "users". Isso deve ser considerado ao nomear os modelos.
O segundo parâmetro do método define()
type
id
age
INTEGER
name
STRING
Mapeamento de alguns tipos do Sequelize para tipos SQL:
Sequelize | SQL |
---|---|
Sequelize.STRING | VARCHAR(255) |
Sequelize.STRING.BINARY | VARCHAR BINARY |
Sequelize.TEXT | TEXT |
Sequelize.INTEGER | INTEGER |
Sequelize.FLOAT | FLOAT |
Sequelize.DOUBLE | DOUBLE |
Sequelize.DECIMAL | DECIMAL |
Sequelize.BOOLEAN | TINYINT(1) |
O conjunto completo de tipos e seu mapeamento para tipos SQL pode ser consultado na documentação oficial.
Além disso, para cada campo, é possível definir mais atributos. O atributo allowNull
true
false
Para o campo id
autoIncrement: true
primaryKey: true
Segunda maneira de definir um modelo:
class User extends Model {}
User.init({
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false
},
name: {
type: Sequelize.STRING,
allowNull: false
},
age: {
type: Sequelize.INTEGER,
allowNull: false
}
}, {
sequelize,
modelName: "user"
});
Sincronizando com o banco de dados
Antes de interagir com o banco de dados, é necessário garantir que as tabelas estão de acordo com a definição dos nossos modelos. Para sincronizar, usamos o método sync
sequelize.sync().then(result => {
console.log(result);
})
.catch(err => console.log(err));
O método sync()
Código completo da aplicaçãoÇ
const Sequelize = require("sequelize");
const sequelize = new Sequelize({
dialect: "sqlite",
storage: "programicio.db"
});
const User = sequelize.define("user", {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false
},
name: {
type: Sequelize.STRING,
allowNull: false
},
age: {
type: Sequelize.INTEGER,
allowNull: false
}
});
sequelize.sync().then(result => {
console.log(result);
})
.catch(err=> console.log(err));
É importante notar que, além dos campos definidos no modelo, dois campos adicionais serão criados na tabela por padrão: createdAt
updatedAts
datetime
Por exemplo, ao trabalhar com um banco de dados SQLite, a tabela criada será descrita pelo seguinte script:
CREATE TABLE IF NOT EXISTS `users` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` VARCHAR(255) NOT NULL,
`age` INTEGER NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NOT NULL
);
Além disso, não é necessário definir o campo id
Também é possível criar a tabela manualmente no servidor e depois conectá-la ao modelo sem a necessidade de sincronização.
Se esses campos adicionais createdAt
updatedAt
{timestamps: false}
const Sequelize = require("sequelize");
const sequelize = new Sequelize({
dialect: "sqlite",
storage: "programicio.db",
define: {
timestamps: false
}
});
const User = sequelize.define("user", {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false
},
name: {
type: Sequelize.STRING,
allowNull: false
},
age: {
type: Sequelize.INTEGER,
allowNull: false
}
});
sequelize.sync().then(result => console.log(result))
.catch(err=> console.log(err));
Se já existir uma tabela no banco de dados que não corresponde à definição do modelo, podemos usar o parâmetro {force: true}
sequelize.sync({force: true}).then(result => {
console.log(result);
})
.catch(err=> console.log(err));