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.js
和X 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、构建器等,并使用 sqler
和 sqler-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的主要内容,如果未能解决你的问题,请参考以下文章