恩! 睽違已久的第三篇,終於出現了!!
既然node.js可以是一種使用JavaScript來做前端跟後端的事,那麼讓人開始思考如何使用Express跟資料庫做連結,昨天開始我起手做這件事情,沒想到接二連三的碰壁,這篇會介紹到基本的CURD的操作(是說...難的我也不會,我對SQL並沒有很熟)。 哦!對了,很多網路上的文章是使用MongoDB,不過因為我還是node.js新手,目前還是先選擇使用自己曾經用過的MySQL。
環境背景:
linux環境下(使用上週申請的MiCloud的smartOS作為練習用途的環境)
node.js Express + mysql(記得裝完Express之後要npm install mysql)
然後我的Express資料夾目錄名為miblog (只是個名稱)...
資料庫與資料表的結構:
mysql -uroot -p
Enter password:
mysql> use miblog;
mysql> show tables;
關於資料表的部分,簡而言之就是我是為了之後要做一個類似留言版的東西
所以目前database命名為miblog,與資料夾同檔名。
資料表目前只有一個,名為Comments;
Part1: 打開mysql_practice:
首先是require mysql,接著一些基本的資料庫設定。
這裡有件事情是,有看過有人寫mysql.createClient(書也是這樣寫),不過我這樣寫就error了。
500 TypeError: Object #<Object> has no method 'createClient'
後來上網查了一下發現,要用createConnection取代createClient。
Part 2 : 撈資料的簡單示範
上面的設定都做好了以後,接著開始最基本的撈資料,
比方說,我要撈出所有comments資料表的內容,以前的sql是這樣下:
select * from comments;
不過在node.js的express要資料的方式為query( );
後面的callback function做的事情為如果有錯誤就會throw,沒有的話將會log出results跟fields,最後在end connection。
(不過我自己個人覺得log出來的results比較有用,但有時候table資料過多時,會有點可怕,是否只需要知道有沒有成功就好,XD,或是使用results.affectedRows來得知影響的筆數)
順帶一提,query最後得到的results,會回傳包含object(一筆資料一個object)的Array,像這樣:
完成上方兩個部分(part1 + part2 )之後,接下來就下node mysql_practice.js
新增筆數
在這裡我就不再贅述上面的Part1資料庫連線方式,
這個範例是當我只想新增欄位的name,如果成功就會回傳被新增的id是多少,
當然我只設定name的值,所以這筆資料新增的時候,comment跟time的欄位就會變成空值。
那如果我是要新增所有欄位的資料呢?
Tip: 如何寫入現在的時間? ==> NOW()會寫入現在時間。
也可以這樣子寫:
刪除某一筆資料
已刪除id為25的資料為例。
更新某筆資料的欄位內容
已更新id為24的name欄位為'this is new name'為例
最基本的操作,大概就是這樣,應該足夠我應付要完成留言板的作業XD
參考:
Learning Node - O'REILLY出版 - chapter11(The Node Relational Database Bingings)
最近不是偷懶,是太忙(><),
關於前面的幾集,還麻煩大家多多關照&指教。環境背景:
linux環境下(使用上週申請的MiCloud的smartOS作為練習用途的環境)
node.js Express + mysql(記得裝完Express之後要npm install mysql)
然後我的Express資料夾目錄名為miblog (只是個名稱)...
miblog-
|-app.js
|-mysql_practice.js (請手動增加此檔案)
|-node_modules
|-package.json
|-public
|-routes
-views
*mysql_practice.js :
我之後會在這個檔案寫所有的mysql的事情,包含連線方式,
之後會直接使用node mysql_practive.js的方式直接去run這個檔案&測試結果。
資料庫與資料表的結構:
mysql -uroot -p
Enter password:
mysql> use miblog;
mysql> show tables;
+---------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(15) | NO | | NULL | | | comment | text | NO | | NULL | | | time | text | NO | | NULL | | +---------+-------------+------+-----+---------+----------------+
關於資料表的部分,簡而言之就是我是為了之後要做一個類似留言版的東西
所以目前database命名為miblog,與資料夾同檔名。
資料表目前只有一個,名為Comments;
- 欄位id =>流水編號
- name=> 儲存留言者的姓名
- comment=>儲存留言者的評論
- time=>儲存留言時間
Part1: 打開mysql_practice:
首先是require mysql,接著一些基本的資料庫設定。
var mysql = require('mysql');
var DATABASE = 'miblog';
var TABLE ='comments';
var connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'YOUR Password(這裡是...你的密碼...)',
});
connection.query('USE ' + DATABASE);
這裡有件事情是,有看過有人寫mysql.createClient(書也是這樣寫),不過我這樣寫就error了。
500 TypeError: Object #<Object> has no method 'createClient'
後來上網查了一下發現,要用createConnection取代createClient。
Part 2 : 撈資料的簡單示範
上面的設定都做好了以後,接著開始最基本的撈資料,
比方說,我要撈出所有comments資料表的內容,以前的sql是這樣下:
select * from comments;
不過在node.js的express要資料的方式為query( );
connection.query('SELECT * FROM ' + TABLE, function(err, results, fields){
if(err) throw err;
console.log(results);
console.log(fields);
connection.end();
});
後面的callback function做的事情為如果有錯誤就會throw,沒有的話將會log出results跟fields,最後在end connection。
(不過我自己個人覺得log出來的results比較有用,但有時候table資料過多時,會有點可怕,是否只需要知道有沒有成功就好,XD,或是使用results.affectedRows來得知影響的筆數)
順帶一提,query最後得到的results,會回傳包含object(一筆資料一個object)的Array,像這樣:
[{ id: 11, name: 'test2', comment: 'TEST!!!!!!', time: '2013-06-09 12:39:47' }, .......]
完成上方兩個部分(part1 + part2 )之後,接下來就下node mysql_practice.js
[root@XXXX /opt/local/share/httpd/htdocs/miblog]# node mysql_practice.js
[ { id: 14, name: 'Win Wu', comment: '', time: '' },
{ id: 18, name: 'Win Wu', comment: '', time: '' },
{ id: 3,
name: 'this is new nam',
comment: 'yukyukyk',
time: '0000-00-00 00:00:00' },
{ id: 4,
name: 'ykyuk',
comment: 'yukyukyk',
time: '0000-00-00 00:00:00' },
{ id: 5,
name: 'ykyuk',
comment: 'yukyukyk',
time: '0000-00-00 00:00:00' },
......(下方省略)
]
新增筆數
在這裡我就不再贅述上面的Part1資料庫連線方式,
這個範例是當我只想新增欄位的name,如果成功就會回傳被新增的id是多少,
當然我只設定name的值,所以這筆資料新增的時候,comment跟time的欄位就會變成空值。
connection.query('INSERT INTO ' + TABLE +' ' +'SET name = ?',['Win Wu'],
function(err,result){
console.log(result.insertId);
}
);
那如果我是要新增所有欄位的資料呢?
connection.query('INSERT INTO ' + TABLE +' SET name=?, comment=?,
time=NOW()',['test2','TEST!!!!!!'],function(err, result){
console.log(result.insertId);
});
Tip: 如何寫入現在的時間? ==> NOW()會寫入現在時間。
也可以這樣子寫:
connection.query('INSERT INTO ' + TABLE +
'(name, comment, time) ' + 'values(?,?,NOW())',
['This is name','This is test Comment']);
刪除某一筆資料
已刪除id為25的資料為例。
connection.query('DELETE FROM ' + TABLE +
' WHERE id = ? ',[25] ,function(err, result){
if(err){
console.log(err);
}else{
console.log(result.affectedRows);
}
});
更新某筆資料的欄位內容
已更新id為24的name欄位為'this is new name'為例
connection.query('UPDATE ' + TABLE + ' SET ' +
'name=? WHERE id=?',['this is new name',24],function (err,result){
if(err){
console.log(err);
}else{
console.log(result.affectedRows);
}
});
最基本的操作,大概就是這樣,應該足夠我應付要完成留言板的作業XD
參考:
Learning Node - O'REILLY出版 - chapter11(The Node Relational Database Bingings)
沒有留言:
張貼留言
若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD