nodejs裡mysql的相關操作

2021-07-29 23:59:36 字數 4238 閱讀 8950

該**採用mysql.js作為本文的資料庫連線庫,由於使用express故先介紹express下的資料庫配置,關於mysql的安裝這裡不作介紹,可以參考:mac安裝mysql的兩種方法。當然這個過程並非是一番豐順的,出現過很多錯誤,如:

總之,一般都可以在stackoverflow上找到答案。

mysql的配置很簡單,基本都是根據mysql.js文件的文件進行配置的,主要**如:

var mysql=require("mysql");

var pool = mysql.createpool();

var query=function

(sql,callback)else);

}});

};module.exports=query;

這段**起初部署在本地,所以才採取的是127.0.0.1但是實際部署在伺服器上時,由於本站的檔案和資料庫服務都是部署在同乙個伺服器上的,因此無需更改相應的設定。不過如果改變了資料庫的位置,必須要對更改相應的配置。

在上面介紹的**中,sql語句採用的是拼接字串的形式組成的,所以極大可能存在sql注入的危險。此處有兩個解決辦法:

var post  = ;

var query = connection.query('insert into posts set ?', post, function

(error, results, fields) );

var sorter = 'date';

var sql = 'select * from posts order by ' + connection.escapeid('posts.' + sorter);

1. 去除本table中在另乙個table中沒有出現的資料

由於本**在更新標籤資訊時,勢必會存在一種情況是否存在需要檢查是否該種標籤並沒有任何部落格引用,即不存在任何部落格使用該標籤,此時對這種標籤該予以刪除。這裡並沒有採用觸發器檢查,而是在刪除一組標籤和部落格的對應關係時,檢查該標籤是否不存在部落格的引用。 每次統計該標籤的對應關係是否為0,若為0時則需要刪除該標籤,故sql語句為:

delete

from tag where tagid = "+mysql.escape(delcatearr[i].tagid)+"

and (select

count(*) from addtags where tagid="+mysql.escape(delcatearr[i].tagid)+")=0;

2. 資料庫多欄位聯合排序

由於部落格存在更改的情況,故在部落格更新時應該將其與新建立的部落格放置在一起,同時排序。常見的排序方法如下:

select * from data order

by updatetime desc, writetime desc;

//缺點:呆板的按照按照updatetime排序,再在排序結果中按照writetime排序,

目前沒有找到更好的辦法

3. 資料庫模糊查詢

這一功能隨處可見,一般為使用者輸入的聯想詞查詢。在本站中,由於輸入的標籤資料必須保證不重複,因此,使用聯想詞提示查詢資料庫已有結果,同時將結果反饋給使用者。這裡的聯想詞查詢使用的就是資料庫模糊查詢。關於資料庫模糊查詢,網路上有很多介紹,如:

以下來自

1,%:表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文,請使用兩個百分號(%%)表示。

比如 select * from [user] where u_name like 『%三%』

將會把u_name為「張三」,「張貓三」、「三腳貓」,「唐三藏」等等有「三」的記錄全找出來。

另外,如果需要找出u_name中既有「三」又有「貓」的記錄,請使用and條件

select * from [user] where u_name like 『%三%』 and u_name like 『%貓%』

若使用 select * from [user] where u_name like 『%三%貓%』

雖然能搜尋出「三腳貓」,但不能搜尋出符合條件的「張貓三」。

2,_: 表示任意單個字元。匹配單個任意字元,它常用來限制表示式的字元長度語句:

比如 select * from [user] where u_name like 『三』

只找出「唐三藏」這樣u_name為三個字且中間乙個字是「三」的;

再比如 select * from [user] where u_name like 『三__』; 只找出「三腳貓」這樣name為三個字且第乙個字是「三」的;

3,[ ]:表示括號內所列字元中的乙個(類似正規表示式)。指定乙個字元、字串或範圍,要求所匹配物件為它們中的任乙個。

比如 select * from [user] where u_name like 『[張李王]三』 將找出「張三」、「李三」、「王三」(而不是「張李王三」);

如 [ ] 內有一系列字元(01234、abcde之類的)則可略寫為「0-4」、「a-e」

select * from [user] where u_name like 『老[1-9]』 將找出「老1」、「老2」、……、「老9」;

4,[^ ] :表示不在括號所列之內的單個字元。其取值和 相同,但它要求所匹配物件為指定字元以外的任乙個字元。

比如 select * from [user] where u_name like 『[^張李王]三』 將找出不姓「張」、「李」、「王」的「趙三」、「孫三」等;

select * from [user] where u_name like 『老[^1-4]』; 將排除「老1」到「老4」,尋找「老5」、「老6」、……

5,查詢內容包含萬用字元時

由於萬用字元的緣故,導致我們查詢特殊字元「%」、「_」、「[」的語句無法正常實現,而把特殊字元用「[ ]」括起便可正常查詢。據此我們寫出以下函式:

function sqlencode(str) str=replace(str,」』;」,」』;』;」)

str=replace(str,」[「,」[」) 『;此句一定要在最先 str=replace(str,」「,」」) str=replace(str,」%」,」[%]」) sqlencode=str end function

本文沒有太多考慮聯想詞的使用者體驗,因此直接採用第一種,提示所有與使用者有關的輸入的詞,而實際在雲聯想詞時應該把與使用者相似度最高的或者**使用者輸入的結果放置在前面,而將其他結果放置在後面(如使用者輸入有誤時)。

4. 將本地的資料庫匯出到伺服器上

**在測試初期,資料庫的建立都是在本地資料庫中的,因此這裡需要將建立的資料庫結構、資料,特別是結構及設定匯出到sql檔案中,再在伺服器中匯入。

在資料庫匯出的過程中,由於mysql管理在mysqlworkbench中,因此只需要操作workbench就好了,這裡不做介紹。

在伺服器中,在mysql環境中,輸入以下命令執行sql檔案:

source /var/ftp/pub/sogoodsoft.sql(檔案位置);
5. 設定資料編碼格式

由於本**是中文的,因此在建立資料庫中最麻煩的事是設定欄位為中文編碼格式,這裡便於與其它的相容,統一設定為utf8,最初預設為latin1。

在未建立任何表和資料庫時,更改全域性資料庫配置後在建立資料庫和**可以使用utf8的中文編碼。但是若已經建立了,但是不想刪除時,這時候還需要修改資料庫某些欄位的編碼格式。

mysql 更改庫表字段的編碼

1.建立庫時指定編碼:create database testdb default charset gbk

2.修改庫的編碼: alter databasetesttabledefault character set utf8 collate utf8_bin

3.修改表的編碼:alter tabletesttabledefault character set utf8 collate utf8_bin 4

4.修改欄位的編碼:

alter tabletablenamechangeddddvarchar( 45 ) character set utf8 collate utf8_bin not null

是將mysql資料庫tablename表中 dd的字段編碼改能夠該為utf8

nodejs裡的非同步程式設計

指的有像對檔案的操作 像是觸發的事件等 js引擎中執行的一些普通語句for語句 var語句,普通函式的呼叫啊,它們是首先執行完。才會執行像readfile 這些非同步api。它們具有等待的特點。1.在這些非同步api外面再套一層promise函式,將裡面readfile 執行的結果,作為引數傳遞出去...

nodejs檔案相關操作

nodejs中文文件 1.讀檔案1.非同步讀取檔案全部內容fs.readfile path options callback let data fs.readfile video.id,function err,data console.log data 2.同步讀取檔案全部內容 2.讀取目錄內容1...

module init tools裡的相關工具

1.lsmod 列出已經載入的核心模組 lsmod 是列出目前系統中已載入的模組的名稱及大小等 另外我們還可以檢視 proc modules 我們一樣可以知道系統已經載入的模組。2.modinfo 檢視模組資訊 modinfo 可以檢視模組的資訊,通過檢視模組資訊來判定這個模組的用途。3.modpr...