sequelize的使用
與數(shù)據(jù)庫交互有兩種方法:
使用數(shù)據(jù)庫的原生查詢語言(例如SQL) 使用對象數(shù)據(jù)模型(Object Data Model盐固,簡稱 ODM)或?qū)ο箨P(guān)系模型(Object Relational Model,簡稱 ORM)族跛。 ODM / ORM 能將網(wǎng)站中的數(shù)據(jù)表示為 JavaScript 對象闰挡,然后將它們映射到底層數(shù)據(jù)庫。一些 ORM 只適用某些特定數(shù)據(jù)庫礁哄,還有一些是普遍適用的长酗。 使用 SQL 或其它受到支持的查詢語言才能達到最佳性能。ODM 通常慢一些桐绒,因為在對象和數(shù)據(jù)庫格式之間存在一層用于映射的翻譯代碼夺脾,使它不一定會選用最高性能的數(shù)據(jù)庫查詢(尤其是普遍使用級別的 ODM,它必須在各類數(shù)據(jù)庫功能方面做出更大的折衷)茉继。
使用 ORM 的好處是:程序員可以繼續(xù)用 JavaScript 對象的思維而不用轉(zhuǎn)向數(shù)據(jù)庫語義的思維咧叭。 在(同一個或不同網(wǎng)站)使用不同數(shù)據(jù)庫時尤為明顯。使用 ORM 還可以更方便地對數(shù)據(jù)進行驗證和檢查烁竭。
Sequelize:Sequelize是一款基于Nodejs功能強大的異步ORM框架菲茬。 同時支持PostgreSQL, MySQL, SQLite and MSSQL多種數(shù)據(jù)庫,很適合作為Nodejs后端數(shù)據(jù)庫的存儲接口派撕,為快速開發(fā)Nodejs應(yīng)用奠定扎實婉弹、安全的基礎(chǔ)
本文基于sqlite
SQLite是一個進程內(nèi)的庫,實現(xiàn)了自給自足的终吼、無服務(wù)器的镀赌、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫引擎际跪。它是一個零配置的數(shù)據(jù)庫商佛。
就像其他數(shù)據(jù)庫喉钢,SQLite 引擎不是一個獨立的進程,可以按應(yīng)用程序需求進行靜態(tài)或動態(tài)連接良姆。SQLite 直接訪問其存儲文件肠虽。
安裝sequelize
Sequelize 可通過 npm ( 或 yarn ) 獲得. 中文文檔
npm install sequelize
你還需要手動安裝對應(yīng)的數(shù)據(jù)庫驅(qū)動程序:
# 選擇對應(yīng)的安裝:
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server
建立連接(sqlite)
要連接到數(shù)據(jù)庫,你必須創(chuàng)建 Sequelize 實例. 這可以通過將連接參數(shù)分別傳遞給 Sequelize 構(gòu)造函數(shù)或傳遞單個連接 URI 來完成:
var path = require('path')
const Sequelize = require("sequelize");
const sequelize = new Sequelize(undefined, undefined, undefined, {
host: "localhost",
dialect: "sqlite",
storage: path.join(__dirname,"../database/database.sqlite") //數(shù)據(jù)存放路徑
});
測試連接
你可以使用 .authenticate() 函數(shù)來測試連接.
// 在model文件下輸入node note.js測試數(shù)據(jù)庫鏈接是否成功
sequelize
.authenticate()
.then(() => {
console.log("Connection has been established successfully.");
})
.catch(err => {
console.error("Unable to connect to the database:", err);
});
表建模
模型是一個擴展 Sequelize.Model 的類. 模型可以用兩種等效方式定義. 第一個是Sequelize.Model.init(屬性,參數(shù)):
const Model = Sequelize.Model;
class User extends Model {}
User.init({
// 屬性
firstName: {
type: Sequelize.STRING,
allowNull: false
},
lastName: {
type: Sequelize.STRING
// allowNull 默認為 true
}
}, {
sequelize,
modelName: 'user'
// 參數(shù)
});
另一個是使用 sequelize.define:
const Note = sequelize.define("note", {
text: {
type: Sequelize.STRING,
allowNull: false
}
});
在內(nèi)部, sequelize.define 調(diào)用 Model.init.
上面的代碼告訴 Sequelize 在數(shù)據(jù)庫中期望一個名為 users 的表,其中包含 firstName 和 lastName 字段.
// 注意:使用{force:true}每次存數(shù)據(jù)前都將刪除之前同名的文件
Note.sync({force:true})
.then(() => {
Note.create({
text: "數(shù)據(jù)庫里的數(shù)據(jù)"
});
})
查詢
// 查找所有用戶
// {raw: true}
User.findAll().then(users => {
console.log("All users:", JSON.stringify(users, null, 4));
});
// {raw: true}找到的結(jié)果顯示原始數(shù)據(jù),效果類似JSON.stringify
// 創(chuàng)建新用戶
User.create({ firstName: "Jane", lastName: "Doe" }).then(jane => {
console.log("Jane's auto-generated ID:", jane.id);
});
// 刪除所有名為“Jane”的人
User.destroy({
//使用where查找
where: {
firstName: "Jane"
}
}).then(() => {
console.log("Done");
});
// 更新數(shù)據(jù), 將所有沒有姓氏的人改為“Doe”
User.update({ lastName: "Doe" }, {
where: {
lastName: null
}
}).then(() => {
console.log("Done");
});
另外,node.js后臺如何調(diào)試
如果你在編寫Node.js代碼,node-inspector是必備之選歇盼,比Node.js的內(nèi)置調(diào)試器好出許多舔痕。使用起來跟Chrome的javascript調(diào)試器很相似。
使用npm安裝:
npm install node-inspector
然后需要通過瀏覽器連接到node-inspector,需要啟動inspector服務(wù)
node-inspector
啟動, 默認8080端口
最后以debug模式運行node.js應(yīng)用
node --debug app.js
通過URL http://127.0.0.1:8080/debug?port=5858 就可以進行調(diào)試了。