在node或express使用mysql

在node中操作mysql小记

学习到需要接触数据库的时候,开始使用的是通过mongoose操作的mongodb,而且并没有配置本地的mongodb,而是用的云端托管的mongolab,作为一个小白,简单的mongoose操作还行,不求甚解式的去储存数据读取数据,但为什么要这样做,以及除了这样做还能怎样做,我便一无所知。想来想去,我决定先还是把mongodb放一放,先仔细了解下mysql再说,毕竟手上有一本sql必知必会。

这本书当然不错,讲得很详细,但那只是操作mysql的sql语句,我想了解下node中是如何操作mysql,或者说在node中如何与mysql等数据库关联的?在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池。我这里只有对普通连接的小结:

下边是我的一些小结:

1、安装mysql组件:

    npm install mysql

2、在node中运行第一个mysql查询:

    var mysql = require('mysql');
    var connection = mysql.createConnection({
        (
            host: 'localhost',
            user: 'root',
            password: 'your password',
            database: 'usersdata'
        )
    });

    connection.connect();

    var queryString = '在这里输入你要使用的sql语句';

    connection.query(queryString,function(err,rows,fields) {
        if(err) {
            throw err;
        }
        //在这里输入你要进行的操作
    });
    connection.end();

注意:除此之外,你还可以将连接选项(connection options)作为一个单一的字符串而不是一个对象插入进去。

执行查询

最简单的执行查询操作就是调用connection或pool对象的实例的.query( )方法。调用.query()方法可以有三种不同的形式,下面是最简单的一种:

    connection.query('mysql查询字符串',function(err,results,fields) {
        //执行操作
    });

注意:query()方法的第二个参数是一个回调函数,它的三个参数分别代表着不同的含义:

  1. 在查找过程中,如果出错返回的Error
  2. results包含查找的结果
  3. fields包含返回结果的字段信息

connection对象的query方法需要一个回调函数,当回调函数中的三个参数任意一个结束后,该函数会被执行,在上例子中回调函数为一名函数function()。

上面的代码中定义了一个会将结果作为一个单一的数据流返回的匿名函数。但是,如果table有数量非常多的rows,同时你想当每个row但会时对其单独处理,而不是等待着去搜集所有的rows,你可以将上面的代码改成如下这样:

    var mysql = require('mysql');

    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'your password',
        database: 'usersdata'
    });

    connection.connect();

    var query = connection.query('在这里输入你的sql操作语句');

    query.on('error',function(err) {
        throw err;
    });

    query.on('fields',function(fields) {
        console.log(fields);
    });
    query.on('result',function(row) {
        console.log(row.user_name);
    });

    connection.end();

注意:上面的代码中每当有一行数据返回时将其写入console。如果因为某些原因你需要在每一行数据返回前去处理他们,你不得不去暂停query,当你的那些操作完成后再去回复它。

    query.on('result',function(row) {
        connection.pause();
        //你可以在这里进行一些操作
        console.log(row);
        connection.resume();
    });

对query的值进行隐码

为了避免sql的隐码攻击,你可以运行quey之前,对用户数据进行隐藏。下面有两种方法,第一种使用?操作符:

    var mysql = require('mysql');
    var connection = mysql.createConnection({
        //略
    });
    var key = '_edit_lock';
    var queryString = 'SELECT * FROM usersdata WHERE meta_key = ?';

    connection.query(queryString,[key],function(err,rows,fields) {
        if(err) {
            throw err;
        }
        for(var i in rows) {
            console.log(rows[i]);
        }

    });
    connection.end();

另外一种方式是使用 connection.escape( )方法:

    var mysql = require('mysql');
    var connection = mysql.createConnection({
        //略
    });
    var key = '_edit_lock';
    var queryString = 'SELECT * FROM usersdata WHERE meta_key = ' + connection.escape(key);

    connection.query(queryString,function(err,rows,fields) {
        if(err) {
            throw err;
        }
        for(var i in rows) {
            console.log(rows[i]);
        }

    });

获得插入行的id

如果你向表格中插入了一个有自动递增的主键的行的话,你可以通过下面的写法来重新获得这个插入行的id:

    connection.query('INSERT INTO posts SET ?',{title:'test'},function(err,result) {
        if(err) {
        throw err;
        }
        console.log(result.insertId);
    })

获取affected rows的数量

当进行查询过程中,会在数据库中对相应的行进行遍历查找,通过以下的方法可以在插入、更新、删除语句中获得受影响的行数:

    connection.query('DELETE FORM posts WHERE title = "wrong"',function(err,result) {
        if(err) {
            throw err;
        }
        console.log('deleted' + result.affectedRows + 'rows');
    });

获取被改变行的数量

通过result.changedRows这个属性来获得:

changedRows 不同于 affectedRows的点在于它不包括更新行的数量,因为更新行的值并没有被改变。

    connection.query('UPDATE posts SET...',function(err,result) {
        if(err)  {
        throw err;
    }
    console.log('changed' + result.changedRows + 'rows');
    });

其他的一些小方法:

  1. 获得连接的id:通过connection.threadId来获得给定连接的id。
    (未完待续,等我实际用到哪些地方的时候再填上)

中断连接

通过指令来关闭连接的方法有两种:
1、 调用connection的end()方法:

    connection.end(function(err) {
    //
    });

2、调用destroy()方法:

    connection.destroy(function(err) {
        //
    });

后者会对潜在的套接(underlying socket)造成立即的终止,且会确保在这之后不会有任何的事件或函数为连接而触发。

中断重连

mysql的连接可能因为一个错误意外的关闭,此外你可以通过相应的指令来明确的关闭连接。如果你的关闭是因为一些错误意外造成的话,那么你需要去解决这个错误,如果需要请重新打开它;
重连connection的本质实际上是重新建立一个连接。连接一旦断开,从设计角度讲师不能被真正的重新连接的。

    connection.on('close',function(err) {
        if(err) {
            //连接意外中断,重新连接
            connection = mysql.createConnection(connection.config();
        } else {
        console.log('conneciton closed normally')
        }
    });

注意: connection.config 对象保存着最近的链接信息,你可以通过它重新连接到mysql服务器。尝试着将 connection.config 添加到console.log()中,会返回以下信息:

    {
        host: 'localhost',
        port: 3306,
        socketPath: undefined,
         user: 'sam',
        password: 'some-pass',
        database: 'usersdata',
        insecureAuth: false,
        debug: undefined,
        typeCast: true,
        maxPacketSize: 0,
        charsetNumber: 33,
        clientFlags: 193487 
    }

最后附上mysql的README:https://github.com/mysqljs/mysql

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,559评论 18 399
  • MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子...
    沉默剑士阅读 7,383评论 0 16
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,028评论 0 19
  • 模块Github地址 安装 如果需要以前的版本0.9.x系列的文档,请访问v0.9 branch.有时你可以从gi...
    明明三省阅读 6,202评论 1 24
  • 突然变得很不想睡觉,时间变得很长,黑夜中的心跳和时钟一个频率,急促而又缓慢。 失眠往往让人痛苦不堪,在安静的夜里,...
    文艺的大头阅读 271评论 0 0