MySQL 与 Node.js

Posted

技术标签:

【中文标题】MySQL 与 Node.js【英文标题】:MySQL with Node.js 【发布时间】:2011-08-14 16:03:19 【问题描述】:

我刚刚开始接触 Node.js。我来自 php 背景,所以我相当习惯于使用 mysql 来满足我所有的数据库需求。

如何在 Node.js 中使用 MySQL?

【问题讨论】:

你最后做了什么?下面有一些很好的信息,我很想听听你的经历 @Landon,实际上使用 node-mysql 有几个原因,主要是因为它处于相当活跃的开发阶段,并且似乎是使用最广泛的。我也很喜欢multipleStatements 功能。 @crawf 你更喜欢 PHP 还是 Node.js?我跳入 PHP/MySQL,但正在考虑切换到节点,因为考虑到语法是 JS 语法,它会感觉更自然 @Anthony 个人偏好我想,这取决于你正在开发的生态系统,如果你在一个团队中,等等。这个原始帖子很古老,并且在 Node 中发生了很多变化景观在前端和后端工作中更为普遍。我会说,如果你有时间试一试 Node,它与 socket.io 之类的东西非常适合用于实时 Web 套接字。 【参考方案1】:

查看node.js module list

node-mysql — 一个实现 MySQL 协议的 node.js 模块 node-mysql2 — 又一个纯 JS 异步驱动程序。流水线,准备好的语句。 node-mysql-libmysqlclient — 基于 libmysqlclient 的 MySQL 异步绑定

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'

【讨论】:

+1 for node-mysql 实际上使得使用准备好的语句比不使用它们更容易 github.com/bminer/node-mysql-queues 用于事务和与 node-mysql 一起使用的多语句支持。 +1 也适用于 node-mysql。有什么能比 require一个 javascript 库更好的呢 @KevinLaity 我的印象是 node-mysql 确实 not yet 已经实现了准备好的语句。语法只是looks similar。相反,目前看来,特殊字符正在被转义。 另外,您可以将数据库名称添加到连接对象中【参考方案2】:

node-mysql 可能是目前用于处理 MySQL 数据库的最佳模块之一,该数据库得到积极维护和详细记录。

【讨论】:

【参考方案3】:

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

安装 MySQL node.js 驱动:

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

对于全局安装:

npm install -g mysql

对于本地安装:

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

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

2-运行npm install


请注意,要进行连接,您还需要运行 mysql 服务器(独立于节点)

安装 MySQL 服务器:

有很多教程可以解释这一点,而且它有点依赖于操作系统。只需去谷歌搜索how to install mysql server [Ubuntu|MacOSX|Windows]。但是一句话:你得去http://www.mysql.com/downloads/安装。

【讨论】:

npm install --save mysql 将自动安装它并将其添加到您的package.json【参考方案4】:

这是可能对您有所帮助的生产代码。

包.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【参考方案5】:

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')

【讨论】:

【参考方案6】:

Imo,你应该试试 MySQL Connector/Node.js,它是 MySQL 的官方 Node.js 驱动程序。 有关详细说明,请参阅 ref-1 和 ref-2。 我已经尝试了 mysqljs/mysql 可用 here,但我没有找到关于这个库的类、方法、属性的详细文档。

所以我切换到标准的MySQL Connector/Node.jsX DevAPI,因为它是一个基于 Promise 的异步客户端库并且提供了很好的文档。 看看下面的代码 sn -p :

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);
);

【讨论】:

【参考方案7】:

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

具体来说,您可以将其 db-mysql 驱动程序用于Node.js MySQL support。

【讨论】:

谢谢!我也试试看。 node-db 不再受支持(闲置 8 个月,使用已弃用的 node-waf)并且我的安装失败。 “它是用 C++ 构建的,所以性能有保证”——仅仅使用 C++ 并不能保证性能,它仍然必须正确编程。 不仅 node-db 不受支持,链接也已失效——刚刚重定向到某种广告网站。投反对票。 @Mariano,链接下来【参考方案8】:

通过安装库连接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();

For NodeJS mysql connecting and querying example

【讨论】:

据我所知,alpha 版本永远不会被视为“稳定”。如果我错了纠正我。 Alpha 有可能在进入最终版本之前大幅更改其 API,这在生产(甚至开发)代码中是非常不需要的。也就是说,如果版本编号遵循semver.org 准则。 "smart" 引号 ('') 在 js 文件中并不是那么聪明。 我喜欢这条评论,因为它显示了数据库名称的放置位置【参考方案9】:

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

-- 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');
);

【讨论】:

以上是关于MySQL 与 Node.js的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 简介与安装

node基础1--初识Node.js与内置模块

Node.js 概述

NodeJS 第一章 Node的安装与配置

Node.js 入门

Node.js