標籤:class 建立 failed install 安裝 sqlite comm return load
前言:
本人對mysql不是很熟悉,只會命令列的簡單增刪改查。有些觀點可能不到位請諒解。
sequelize是針對node.js和io.js開發的基於ORM的架構,它支援的資料庫包括:PostgreSQL、 MySQL、MariaDB、 SQLite 和 MSSQL。
目錄:
1、安裝mysql
2、建立目錄及檔案
3、串連資料庫並定義模型
4、操作資料庫(增刪改查)
5、sequelize架構的API泛解
1.安裝mysql
安裝環境:win7 x64
- 先去官網下載最新的版本的mysql,進入官網以後,點擊MySQL Community Server,就可以看到mysql最新版本的各種下載版本(如32位還是64位,mis格式後者zip格式)我下載的是5.7.16版本的,zip格式,然後解壓即可。
- 添加環境變數:就是將你解壓後的檔案bin路徑添加到path環境變數中。
- 開啟cmd進入壓縮後的bin檔案下:
執行:mysqld --initialize 這個必須要執行,直接初始化mysql,用來產生data檔案夾
- 解壓後的檔案夾根目錄下面有一個設定檔my-default.ini檔案:
basedir 填寫你解壓後的跟檔案路徑,如:basedir = "D:\mysql\mysql-5.7.16-winx64"
datadir 填寫你資料檔案的路徑:如datadir = "D:\mysql\mysql-5.7.16-winx64\data"
port 一般填3306
在[mysqld]下面添加:skip-grant-tables (這句話主要是用來啟動mysql省略使用者名稱和密碼用的,網上說第一次啟動mysql預設是不需要使用者名稱和密碼,不過我還是建議你加上這一句,等設定好使用者名稱和密碼以後,在去掉這句話)
修改後,儲存。
- 在bin目錄下執行mysqld -install安裝mysql
- 安裝成功以後就可以使用net start mysql命令來啟動mysql伺服器了。
- mysql伺服器啟動和停止命令分別是:
停止:輸入 net stop mysql
啟動:輸入 net start mysql
直接在bin目錄下輸入mysql,再輸入use mysql,即可進入mysql資料庫(無需使用者名稱和密碼)
進入mysql資料庫以後,執行:
update user set authentication_string=password(‘123456‘) where user=‘root‘ and Host = ‘localhost‘; 此處設定使用者名稱為root,密碼為123456。
- 退出資料庫,執行quit退出,然後將設定檔的skip-grant-tables 這句話注釋掉
- 重啟mysql服務,先執行net stop mysql,在執行net start mysql
- 重新進入mysql資料庫,這時就需要使用者名稱和密碼了,進入的命令如下:
mysql -uroot -p123456
2.建立目錄及檔案
寫一個小案例,實現串連資料庫,向表中插入資料,更新表中的資料,查詢表中的資料。
採用express架構
工程檔案如下:
是通過 express -e mysql-demo 直接產生的
建立一個mysql的設定檔:
在工程的根目錄下建立config檔案夾,config/index.js
在index.js檔案中添加如下代碼:
‘use strict‘var all = { sequelize:{ username: ‘root‘, password: ‘111111‘, database: ‘test‘, host: "localhost", dialect: ‘mysql‘, define: { underscored: false, timestamps: true, paranoid: true } }};module.exports = all;定義資料表模型:
在工程根目錄下建立model檔案夾,model/user.js
在user.js檔案中添加如下代碼:
‘use strict‘module.exports = function(sequelize,DataTypes){ var User = sequelize.define(‘user‘,{ id:{ type:DataTypes.UUID, primaryKey:true, allowNull:false, defaultValue:DataTypes.UUIDV1 }, name:{ type:DataTypes.STRING }, age:{ type:DataTypes.INTEGER }, height:{ type:DataTypes.INTEGER }, weight:{ type:DataTypes.INTEGER } },{ freezeTableName: true }); return User;};
freezeTableName: true 這個選項表示,資料庫中的表明與程式中的保持一致,否則資料庫中的表名會以複數的形式命名
串連資料庫:
在工程根目錄下建立sqldb檔案夾,sqldb/index.js
在index.js檔案中添加如下代碼:
‘use strict‘var config = require(‘../config‘);var Sequelize = require(‘sequelize‘);var db = { sequelize:new Sequelize(config.sequelize.database,config.sequelize.username,config.sequelize.password,config.sequelize)};db.User = db.sequelize.import(‘../model/user.js‘);module.exports = db;
最後在app.js檔案中引入sqldb/index.js檔案就完成了資料庫的串連和資料表的建立。
在app.js檔案加入如下代碼:
var sqldb = require(‘./sqldb‘);
sqldb.sequelize.sync({force: false}).then(function() {
console.log("Server successed to start");
}).catch(function(err){
console.log("Server failed to start due to error: %s", err);
});
sqldb.sequelize.sync介面用於同步模型到資料庫。
4.操作資料庫(增刪改查)
向user表中插入資料:
在routes/index.js檔案中加入如下代碼:
router.post(‘/add/user‘,function(req,res,next){ console.log("+++++++++++++++++++++++"); var saveUser = { name:req.body.name, age:req.body.age, height:req.body.height, weight:req.body.weight }; return db.sequelize.transaction(function(t){ console.log("+++++++++++++++++++"); return User.create(saveUser,{ transaction:t }).then(function(result){ res.send(result); }).catch(function(err){ console.log("發生錯誤:" + err); }); })});
查詢資料表中的資料(以id欄位來查詢):
在routes/index.js檔案中加入如下代碼:
router.get(‘/get/user/:userid‘,function(req,res,next){ return db.sequelize.transaction(function(t){ return User.findOne({ id:req.params.userid },{ transaction:t }).then(function(result){ res.send(result); }).catch(function(err){ console.log("發生錯誤:" + err); }); });});
更新資料:
router.post(‘/update/user/age‘,function(req,res,next){ return db.sequelize.transaction(function(t){ return User.findById(req.body.userid,{ transaction:t }).then(function(user){ return user.update({ age:req.body.age },{ transaction:t }).then(function(result){ res.send(result); }).catch(function(err){ console.log("發生錯誤:" + err); }); }) })});
這裡有一點,不知道是不是bug,我是先查詢,然後再更新,如果以id來查詢,查到的一直是資料表中的第一個資料,無賴改成findByid的形式查詢就可以了。(如果只查詢,不更新的話,採用findOne即可,暫時不知道是什麼原因)
5.sequelize架構API泛解
sequelize目前我使用到的api分為兩大類,一類屬於sequelize,一類屬於model。
sequelize類是是引用sequlize模組後擷取一個頂級對象,我們通過它來建立sequlize執行個體,sequelize最常用的API是transaction(啟動事物API介面),一般動作表的介面都會先調用這個介面,如上面代碼中的:
return db.sequelize.transaction(function(t){ return User.findOne({ ...... })});
要查詢表資料,先要調用sequelize的transaction介面來啟動事物。
model類API:model類的API主要用於資料表的內部操作。
如findOne,尋找資料。
create,插入資料。
demo地址
nodejs+sequelize操作mysql資料庫