MySQL与Node.js


375

我刚刚开始接触Node.js。我来自PHP背景,因此我习惯于使用MySQL满足所有数据库需求。

如何在Node.js中使用MySQL?


5
你最终要做什么?以下是一些很好的信息,我很想听听您的经历
Landon 2012年

7
@Landon实际上与node-mysql一起使用有几个原因,主要是因为它处于相当活跃的开发中,并且似乎使用最广泛。我也很喜欢这个multipleStatements功能。
crawf 2012年

@crawf您更喜欢PHP还是Node.js?我跳到PHP / MySQL,但是我考虑切换到节点,因为考虑到语法是JS语法,它会自然地变得更加自然
oldboy

1
@Anthony我想个人喜好,这取决于您正在开发的生态系统,如果您在团队中,等等。此原始帖子很古老,并且在Node方面发生了很多变化,Node方面的变化更为普遍。和后端工作。我想说的是,如果您有时间允许使用Node,那么它可以与用于实时Web套接字的socket.io之类的东西完美结合。
爬网

Answers:


426

查看node.js模块列表

node-mysql看起来很简单:

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'bob',
  password : 'secret',
});

connection.connect(function(err) {
  // connected! (unless `err` is set)
});

查询:

var post  = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
  // Neat!
});
console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

81
节点mysql的+1实际上使使用准备好的语句比不使用它们更容易
Kevin Laity

2
github.com/bminer/node-mysql-queues用于事务处理,以及与node-mysql一起使用的多语句支持。
BMiner

2
也为节点mysql +1。有什么能更好的不仅仅是require荷兰国际集团JavaScript库
亚历ķ

4
@KevinLaity给我的印象是node-mysql 尚未实现准备好的语句。语法看起来很相似。相反,目前看来,特殊字符已被转义。
funseiki

4
另外,您还可以获取数据库名称,在连接对象中添加“数据库”
felipekm 2014年

28

node-mysql可能是其中最好的模块之一,用于处理MySQL数据库,该数据库已得到积极维护并有据可查。


19

由于这是旧线程,因此只需添加更新:

要安装MySQL node.js驱动程序:

如果仅运行npm install mysql,则需要与运行服务器所在的目录相同。我建议按照以下示例之一进行操作:

对于全局安装:

npm install -g mysql

对于本地安装:

1-将其添加到您package.json的依赖项中:

"dependencies": {
    "mysql": "~2.3.2",
     ...

2运行 npm install


请注意,要使连接发生,您还需要运行mysql服务器(与节点无关)

要安装MySQL服务器:

那里有很多教程可以解释这一点,这有点取决于操作系统。只需转到Google并搜索how to install mysql server [Ubuntu|MacOSX|Windows]。但有一句话:您必须转到http://www.mysql.com/downloads/并进行安装。


2
npm install --save mysql将安装它,它添加到您的package.json自动
Xeoncross

10

这是可以帮助您的生产代码。

Package.json

{
  "name": "node-mysql",
  "version": "0.0.1",
  "dependencies": {
    "express": "^4.10.6",
    "mysql": "^2.5.4"
  }
}

这是服务器文件。

var express   =    require("express");
var mysql     =    require('mysql');
var app       =    express();

var pool      =    mysql.createPool({
    connectionLimit : 100, //important
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'address_book',
    debug    :  false
});

function handle_database(req,res) {

    pool.getConnection(function(err,connection){
        if (err) {
          connection.release();
          res.json({"code" : 100, "status" : "Error in connection database"});
          return;
        }   

        console.log('connected as id ' + connection.threadId);

        connection.query("select * from user",function(err,rows){
            connection.release();
            if(!err) {
                res.json(rows);
            }           
        });

        connection.on('error', function(err) {      
              res.json({"code" : 100, "status" : "Error in connection database"});
              return;     
        });
  });
}

app.get("/",function(req,res){-
        handle_database(req,res);
});

app.listen(3000);

参考:https : //codeforgeek.com/2015/01/nodejs-mysql-tutorial/


该代码似乎搞砸了。.许多错误包括Cannot read property 'release' of undefined
Pacerier's

3

KnexJs可以在Node.JS和浏览器中用作SQL查询生成器。我发现它易于使用。试试看-Knex.js

$ npm install knex --save
# Then add one of the following (adding a --save) flag:
$ npm install pg
$ npm install sqlite3
$ npm install mysql
$ npm install mysql2
$ npm install mariasql
$ npm install strong-oracle
$ npm install oracle
$ npm install mssql


var knex = require('knex')({
  client: 'mysql',
  connection: {
    host : '127.0.0.1',
    user : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test'
  }
});

你可以这样使用

knex.select('*').from('users')

要么

knex('users').where({
  first_name: 'Test',
  last_name:  'User'
}).select('id')

3

Imo,您应该尝试使用MySQL Connector / Node.js,它是MySQL的官方Node.js驱动程序。有关详细说明,请参见ref-1ref-2。我已经尝试过mysqljs / mysql,可在这里获得,但是我找不到关于该库的类,方法和属性的详细文档。

所以我切换到标准MySQL Connector/Node.jsX DevAPI,因为它是一个基于异步守信用客户端库,并提供良好的文档。看一下以下代码片段:

const mysqlx = require('@mysql/xdevapi');
const rows = [];

mysqlx.getSession('mysqlx://localhost:33060')
.then(session => {
    const table = session.getSchema('testSchema').getTable('testTable');

    // The criteria is defined through the expression.
    return table.update().where('name = "bar"').set('age', 50)
        .execute()
        .then(() => {
            return table.select().orderBy('name ASC')
                .execute(row => rows.push(row));
        });
})
.then(() => {
    console.log(rows);
});

1

您还可以尝试一种称为Node.js DB的新功能,该功能旨在为多个数据库引擎提供一个通用框架。它是用C ++构建的,因此可以保证性能。

具体来说,您可以使用其db-mysql驱动程序获得Node.js MySQL支持


1
谢谢!我也会去。
2011年

4
不再支持node-db(不活动8个月,使用不推荐使用的node-waf),对我而言安装失败。
Yogu 2014年

18
“它是用C ++构建的,因此可以保证性能”-简单地使用C ++不能保证性能,但仍然必须正确编程。
developerbmw

不仅不支持node-db,而且链接是虚假的-刚才重定向到某种广告网站。投票失败。
nurdglaw

2
@Mariano,链接关闭
Pacerier '17

0

通过安装库连接mysql数据库。在这里,选择了稳定且易于使用的node-mysql模块。

npm install mysql@2.0.0-alpha2

var http = require('http'),
   mysql = require('mysql');

var sqlInfo = {
   host: 'localhost',
   user: 'root',
   password: 'urpass',
   database: 'dbname'
}
client = mysql.createConnection(sqlInfo);

client.connect();

对于NodeJS mysql连接和查询示例


2
据我所知,alpha发行版永远不会被视为“稳定”版本。如我错了请纠正我。Alpha可以在进入最终版本之前大幅更改其API,这在生产(甚至开发)代码中是非常不希望的。也就是说,如果版本编号遵循semver.org准则。
罗宾·范·巴伦

1
事实证明,“聪明”引号('')在js文件中并不是那么聪明。
glyph

我喜欢这个评论,因为它显示了放置数据库名称的位置
Boris Ivanov

0

您可以跳过ORM,构建器等,并使用sqler和简化DB / SQL管理sqler-mdb

-- create this file at: db/mdb/setup/create.database.sql
CREATE DATABASE IF NOT EXISTS sqlermysql
const conf = {
  "univ": {
    "db": {
      "mdb": {
        "host": "localhost",
        "username":"admin",
        "password": "mysqlpassword"
      }
    }
  },
  "db": {
    "dialects": {
      "mdb": "sqler-mdb"
    },
    "connections": [
      {
        "id": "mdb",
        "name": "mdb",
        "dir": "db/mdb",
        "service": "MySQL",
        "dialect": "mdb",
        "pool": {},
        "driverOptions": {
          "connection": {
            "multipleStatements": true
          }
        }
      }
    ]
  }
};

// create/initialize manager
const manager = new Manager(conf);
await manager.init();

// .sql file path is path to db function
const result = await manager.db.mdb.setup.create.database();

console.log('Result:', result);

// after we're done using the manager we should close it
process.on('SIGINT', async function sigintDB() {
  await manager.close();
  console.log('Manager has been closed');
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.