sequelize 增加數據庫字段_Node項目使用Sequelize操作數據庫(一)(包括模型,增,刪、改等)...

Sequelize 是一個基于 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有強大的事務支持,關聯關系、讀取和復制等功能。

所謂ORM是指對象關系映射,通過使用描述對象和數據庫之間映射的元數據,將面向對象語言程序中的對象自動持久化到關系數據庫中。本質上就是將數據從一種形式轉換到另外一種形式

以下以使用mysql數據庫作為案例

為了演示,首先新建文件夾初始化項目

$ mkdir sequelizeTest // 新建文件夾

$ cd sequelizeTest // 進入文件夾

$ npm init --yes // 初始化項目

1. 安裝

// Using NPM

$ npm install --save sequelize

// 使用哪種數據庫選擇不同的安裝

$ npm install --save mysql2

$ npm install --save pg pg-hstore # Postgres

$ npm install --save mariadb

$ npm install --save sqlite3

$ npm install --save tedious # Microsoft SQL Server

我這里安裝mysql2

2.數據庫連接測試

在項目文件夾下新建一個index.js

(async function() {

const Sequelize = require('sequelize');

// 第一個參數是數據庫名,第二個參數是數據庫用戶名,第三個參數密碼

// 第四個參數配置參數 包括地址,數據庫類型等

const sequelize = new Sequelize('list', 'root', '123456', {

host: 'localhost',

dialect: 'mysql'

});

// 測試是否連接函數

sequelize.authenticate()

.then(() => {

console.log('連接成功');

console.log("hello");

})

.catch(err => {

console.log(err);

})

})()

使用nodemon 作為熱更新啟動,這樣就不用每次重啟了

$ npm install nodemon -g

啟動項目

$ nodemon index

顯示如下,說明已成功

3.定義模型

用來表述(描述)數據庫表字段信息的對象,每一個模型對象表示數據庫中的一個表,后續對數據庫的操作都是通過對應的模型對象來完成的

modelName:模型名稱,自定義

attributes:模型中包含都數據,每一個數據映射對應表中都每一個字段

options:模型(表)的設置

attributes:字段值描述:

type:字段類型,String|DataTypes

allowNull:是否允許為空,默認為true

defaultValue:默認值,默認為null

unique:值唯一,默認為false

primaryKey:是否為主鍵,默認為false

options:模型(表)的設置

timestamps:是否給每條記錄添加 createdAt 和 updatedAt 字段,并在添加新數據和更新數據的時候自動設置這兩個字段的值,默認為true

paranoid:設置 deletedAt 字段,當刪除一條記錄的時候,并不是真的銷毀記錄,而是通過該字段來標示,即保留數據,進行假刪除,默認為false

freezeTableName:禁用修改表名; 默認情況下,sequelize將自動將所有傳遞的模型名稱(define的第一個參數)轉換為復數。 默認為false

tableName:手動設置表的實際名稱

定義表索引? ? indexes:Array

每個索引對象可以設置的值

name:索引名稱,默認模型名稱+字段

fields: Array,索引字段

unique:唯一索引,默認false

創建模型實例對象

一個模型類對應一個表,一個模型實例對象就是一條對應的表記錄,通過操作這個對象來關聯操作對應的表中的數據,操作模型類就是操作表,操作模型類對象就是操作該表中的某條記錄 ?? ??? ?模型類 - 表 ?? ??? ?模型實例 - 記錄

舉例:

新建數據庫list,新建一個users表 數據結構如下:

定義模型

(async function() {

const Sequelize = require('sequelize');

const sequelize = new Sequelize('list', 'root', '123456', {

host: 'localhost',

dialect: 'mysql'

});

const UsersModel = await sequelize.define('Users', {

id: {

allowNull: false,

autoIncrement: true,

primaryKey: true,

type: Sequelize.INTEGER

},

username: {

type: Sequelize.STRING(20),

allowNull: false

},

password: {

type: Sequelize.CHAR(32),

allowNull: false

},

createdAt: {

allowNull: false,

type: Sequelize.DATE

},

updatedAt: {

allowNull: false,

type: Sequelize.DATE

}

}, {

tableName: 'users'

});

// UsersModel

// let user = UsersModel.build({

// username: "swnd",

// password: "q11111"

// });

// user = await user.save();

// console.log(user.get({'id': 3}));

})()

4. 單表的增刪改

方式一:調用 build 方法后對象只存在于內存中,需要進一步調用 save 方法才會保存到數據庫中。

let user = UsersModel.build({

username: "swnd",

password: "q11111"

});

user = await user.save();

console.log(user.get({'id': 3}));

以上代碼運行后,終端將會輸出以下信息:

方式二:調用 create 方法后,會直接保存到數據庫中。

const user = UsersModel.create({

username: 'zhangsan',

password: '123456'

})

console.log(user.get({'id': 6}));

方案一

const hasUser = await UsersModel.findOne({

where: {

id: 6,

username: 'zhangsan'

}

});

hasUser.username = 'wanggangdan'

hasUser.save();

方案二

const hasUser = await UsersModel.findOne({

where: {

id: 6

}

});

const updatedUser = await hasUser.update({

username: "green"

});

hasUser.save();

限制更新某字段

// 方案一

const hasUser = await UsersModel.findOne({

where: {

id: 6

}

});

const updatedUser = await hasUser.update({

username: "green2",

password: '8888888888'

},{

fields: ['username'] // 只允許更新這個

});

// 方案二

const hasUser = await UsersModel.findOne({

where: {

id: 6

}

});

hasUser.username = 'wanggangdan'

hasUser.passwprd = '8989878888'

hasUser.save({ fields: ['username'] }); // 只允許更新這個

const hasUser = await UsersModel.findOne({

where: {

id: 3

}

});

await hasUser.destroy();

如果我們啟用了 paranoid(偏執)模式,destroy 的時候不會執行 DELETE 語句,而是執行一個 UPDATE 語句將 deletedAt 字段設置為當前時間(一開始此字段值為NULL)。不過需要注意的是,僅當 timestamps=true 為 true 時,paranoid 模式才能生效。

未完待續

本篇測試代碼

(async function() {

const Sequelize = require('sequelize');

const sequelize = new Sequelize('list', 'root', '123456', {

host: 'localhost',

dialect: 'mysql'

});

const UsersModel = await sequelize.define('Users', {

id: {

allowNull: false,

autoIncrement: true,

primaryKey: true,

type: Sequelize.INTEGER

},

username: {

type: Sequelize.STRING(20),

allowNull: false

},

password: {

type: Sequelize.CHAR(32),

allowNull: false

},

createdAt: {

allowNull: false,

type: Sequelize.DATE

},

updatedAt: {

allowNull: false,

type: Sequelize.DATE

}

}, {

tableName: 'users'

});

// 增

// 方式一

// let user = UsersModel.build({

// username: "swnd",

// password: "q11111"

// });

// user = await user.save();

// console.log(user.get({'id': 3}));

// 方式二

// const user = UsersModel.build({

// username: 'zhangsan2',

// password: '123456'

// })

// console.log(user.get({'id': 6}));

// 改

const hasUser = await UsersModel.findOne({

where: {

id: 3

}

});

// hasUser.username = 'wanggangdan'

// hasUser.passwprd = '8989878888'

// hasUser.save({ fields: ['username'] }); // 只允許更新這個

// const updatedUser = await hasUser.update({

// username: "green2",

// password: '8888888888'

// },{

// fields: ['username'] // 只允許更新這個

// });

await hasUser.destroy();

})()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443627.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

django orm插入一條_如何通過django的ORM遠程發布文章?

利用django的ORM可以方便的給數據庫插入文章但是假如我django放在阿里云,那我想在本地寫個插件,每天很方便的插入一些數據,最好是通過ORM的,因為管理起來比較方便,會涉及到多個站,可能會有200多個站&#x…

循環斐波那契數列_第五課:斐波那契數列(第一課時)

簡介:又稱黃金分割數列、因數學家列昂納多斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34……在數學上,斐波那契數列以如下被以遞推的方法定義:F(…

命令行 藍牙_Ubuntu使用BlueZ驅動藍牙dongle

藍牙dongle即藍牙適配器,一般為USB接口,通過USB連接到PC等設備。連接dongle后,PC即可使用驅動程序控制dongle連接其它藍牙設備。本文主要介紹在Ubuntu系統中安裝BlueZ的方法及藍牙的使用。01獲取BlueZBlueZ是Linux系統的官方藍牙協議棧&#…

Java在Windows下導出xml文件到Linux服務器上

最近由于公司項目需要,學習了在Windows平臺導出xml文件到Linux服務器上的指定目錄下的方法,(注:這里的我的Linux是在本機上裝的虛擬機)現在寫下來記錄一下! 1.首先是項目截圖: 2.主要是類&…

java peek函數_Java 8 Stream Api 中的 peek 操作

1. 前言我在 Java 8 Stream API中的 map 和flatMap 中講述了Java8 Stream API中 map 操作和 flatMap 操作的區別。然后有小伙伴告訴我 peek 操作 也能實現元素的處理。但是你知道 map 和 peek 的區別嗎? map 我們在開頭文章已經講過了,你可以去詳細了解一…

iphone如何查看dns延遲_iPhone手機網速慢?1分鐘教你設置DNS,網速立馬翻一番

很多小伙伴在購機時選擇蘋果手機都是因為iOS系統的流暢度和精簡性,但iPhone在可玩性和信號方面是不如安卓手機的。大家在使用過程中一定遇到過這樣的情況,連接同一個無線網,但是蘋果的網速總是要比安卓慢,這該怎么辦呢&#xff1f…

mysql 關系_MySQL之關系

關系多對多的關系,如何通過mysql來表示站在老師的角度一個老師可以教多個學生,一個老師也可以教一個學生。站在學生的角度一個學生可以被一個老師教一個學生也可以被多個老師教結論:如果站在兩邊看都是一對多的情況,那么這個關系就…

mysql賬號密碼忘_mysql用戶名密碼忘記了解決方法

今天想用一下實驗室服務器的mysql,發現不記得用戶名密碼了。解決方法如下:1. 保證服務器處于安全的狀態,如果可以請拔掉網線...(不過我跳過了這一步,額)2. 修改/etc/my.cnf文件在[mysqld]的段中加入:skip-grant-tables…

copying mysql status_mysql慢查詢copying to tmp table

windows server,無論修改my.ini的tmp_table_size,max_heap_table_size到多少,情況都一樣。同樣的表和查詢語句,在本地運行,沒出現慢查詢。SELECTg.goods_id,g.goods_name,g.shop_price,g.goods_thumb,SUM(og.goods_num…

JDK 7,jdk1.7 安裝及配置

1.打開網頁:http://www.oracle.com 下載對應平臺的合適JDK。 2. 雙擊下載的exe,如jdk-7u7-windows-i586.exe。 3.進入安裝向導: 4.下一步,更改安裝路徑,選擇安裝所有組件。 更改為D:\jdk1.7.0_07\ 點擊確定 5.下一步,…

c mysql 編譯_MySQL編譯安裝之cmake

mysql版本5.5以上編譯安裝時需要用到軟件cmake,cmake特性是獨立于源碼編譯,編譯工作可以在另外一個目錄中而非源碼目錄中進行,mysql版本5.5以上編譯安裝時需要用到軟件cmake,cmake特性是獨立于源碼編譯,編譯工作可以在…

vb連接mysql未發現_vb連接MySQL遇到的問題解決方法

1.安裝mysql,2.安裝MyODBC-standard-3.51.07-win.msi3:vb連接語句是:Public strcnn As StringPublic sql As StringPublic conn A1.安裝mysql,2.安裝MyODBC-standard-3.51.07-win.msi3:vb連接語句是:Public strcnn As StringPublic sql As StringPublic conn As New ADODB.Conn…

mysql常用內置函數_mysql常見內置函數

在mysql中有許多內置的函數,雖然功能都能在PHP代碼中實現,但巧妙的應用mysql內置函數可以大大的簡化開發過程,提高效率。在這里我總結一下一些常用的,方便以后查看:mysql字符串函數:concat(String2 [,...])…

mysql里面有沒有map類型_MySQL學習(二) 數據類型

MySQL支持多種列類型:數值類型、日期/時間類型和字符串(字符)類型。數值類型數值類型又分為整數型與小數型整數型下面的表顯示了需要的每個整數類型的存儲和范圍創建一張表mysql> CREATE TABLE t_int (int_1 TINYINT,int_2 SMALLINT,int_3 MEDIUMINT,int_4 INT,i…

mysql alter table if_MySQL中的alter table命令的基本使用方法及提速優化

一、基本用法1. 增加列?1alter table tbl_nameadd col_name type例如, 給pet的表增加一列 weight,?1mysql>alter table petadd weightint;2. 刪除列?1alter table tbl_namedrop col_name例如, 刪除pet表中的weight這一列?1mysql>alter table petdrop weight;3. 改變…

mysql_real_escape_string 報錯_addslashes與mysql_real_escape_string的區別

addslashes和mysql_real_escape_string.都是為了使數據安全的插入到數據庫中而進行過濾.那么這兩個函數到底是有什么區別呢??我們今天來簡單的看下..首先.我們還是從PHP手冊入手..手冊上addslashes轉義的字符是單引號()、雙引號(")、反斜線(\)與NUL(NULL 字符)。mysql_r…

shell執行perl_【編程技巧(一)】在Perl、Shell和Python中傳參與輸出幫助文檔

社會你明哥,人狠話又多!【小明的碎碎念】與你不見不散!作為一名搞數據的生物狗,咱們是生物狗中代碼寫得最六的,程序員中生物學得最好的——大家沒意見吧,有意見請憋著跟隨小明的步伐,讓我們開開…

項目開發中的編碼規范

1.規范存在的意義: 好的編碼規范可以盡可能的減少一個軟件的維護成本 , 并且幾乎沒有任何一個軟件,在其整個生命周期中,均由最初的開發人員來維護; 好的編碼規范可以改善軟件的可讀性,可以讓開發人員盡快而徹底地理解…

mysql 5.6.36安裝圖解_2017年12月聚合文章--實戰-Mysql5.6.36腳本編譯安裝及初始化 | 碼友網...

概述本文為centos7.3自動化編譯安裝mysql5.3.6的腳本及后續初始化操作,話不多少,直接上腳本。安裝腳本install.py如下:#codingutf-8#!/usr/bin/pythonimport os,commands#定義變量install_dir /data/mysqldata_dir /data/mysql/datapackage…

python之路2.0_Python之路【第二十一篇】:JS基礎

1.2 ECMAScript盡管 ECMAScript 是一個重要的標準,但它并不是 JavaScript 唯一的部分,當然,也不是唯一被標準化的部分。實際上,一個完整的 JavaScript 實現是由以下 3 個不同部分組成的:● 核心(ECMAScript)● 文檔對象…