MySQL с Node.js


376

Я только начал проникать в Node.js. Я родом из PHP, поэтому я довольно привык использовать MySQL для всех нужд своей базы данных.

Как я могу использовать MySQL с Node.js?


5
с чем вы в итоге поехали? ниже приведена некоторая полезная информация, мне было бы интересно услышать, что вы испытали
Landon

7
@Landon, на самом деле пошел с node-mysql по нескольким причинам, главным образом потому, что он находится в довольно активной разработке и, кажется, наиболее широко используется. Мне тоже очень нравится эта multipleStatementsфункция.
crawf

@crawf Что вы предпочитаете, PHP или Node.js? Я перешел на PHP / MySQL, но думаю о переходе на узел, так как он будет гораздо более естественным, учитывая, что синтаксис - это синтаксис JS
oldboy

1
@Anthony Личные предпочтения, я полагаю, это зависит от экосистемы, в которой вы разрабатываете, от того, работаете ли вы в команде и т. Д. Этот оригинальный пост является древним, и многое изменилось в ландшафте Node, где он гораздо более распространен для фронта. и бэк-энд работа. Я бы сказал, если у вас есть время попробовать Node, и он отлично сочетается с такими вещами, как socket.io для веб-сокетов в реальном времени.
crawf

Ответы:


427

Проверьте список модулей node.js

  • node-mysql - модуль node.js, реализующий протокол MySQL
  • node-mysql2 - еще один чистый асинхронный драйвер JS. Конвейерная подготовка, готовые высказывания.
  • node-mysql-libmysqlclient - асинхронные привязки MySQL на основе libmysqlclient

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
+1 для node-mysql, фактически облегчающего использование подготовленных операторов, чем неиспользование их
Кевин Лэйти

2
github.com/bminer/node-mysql-queues для транзакций и поддержка нескольких операторов для использования с node-mysql.
BMiner

2
+1 для узла-MySQL тоже. Что может быть лучше, чем просто requireиспользование библиотеки javascript
Alex K

4
@KevinLaity У меня сложилось впечатление, что в node-mysql еще не реализованы подготовленные операторы. Синтаксис выглядит так же . Вместо этого кажется, что на данный момент специальные символы экранированы.
funseiki

4
Кроме того, вы можете получить имя базы данных, добавив «database» к объекту подключения
felipekm

29

node-mysql , вероятно, является одним из лучших модулей для работы с базой данных MySQL, который активно поддерживается и хорошо документирован.


20

Поскольку это старая ветка, просто добавляем обновление:

Чтобы установить драйвер 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/ и установить его.


3
npm install --save mysqlустановит его и добавит к вашему package.jsonавтоматически
Xeoncross

11

Вот производственный код, который может вам помочь.

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
испорченным

4

Imo, вы должны попробовать MySQL Connector / Node.js, который является официальным драйвером Node.js для MySQL. Смотрите ref-1 и ref-2 для подробного объяснения. Я пробовал mysqljs / mysql, который доступен здесь , но я не нахожу подробную документацию по классам, методам, свойствам этой библиотеки.

Поэтому я перешел на стандарт MySQL Connector/Node.jsс X DevAPI, поскольку это асинхронная клиентская библиотека на основе Promise и предоставляет хорошую документацию. Взгляните на следующий фрагмент кода:

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

3

KnexJs можно использовать как построитель SQL-запросов как в Node.JS, так и в браузере. Я нахожу это простым в использовании. Давай попробуем - 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')

1

Вы также можете попробовать новую работу, известную как Node.js DB, которая призвана обеспечить общую платформу для нескольких механизмов баз данных. Он построен на C ++, поэтому производительность гарантирована.

В частности , вы можете использовать свой драйвер DB-MySQL для поддержки Node.js MySQL .


1
Спасибо! Я тоже попробую.
crawf

4
node-db больше не поддерживается (неактивен в течение 8 месяцев, использует устаревший node-waf), и установка не удалась для меня.
Йогу

18
«Он построен на C ++, поэтому производительность гарантирована» - простое использование C ++ не гарантирует производительность, его все равно нужно программировать правильно.
developerbmw

Мало того, что node-db не поддерживается, ссылка не работает - только что перенаправлена ​​на какой-то рекламный сайт. Downvoting.
nurdglaw

2
@Mariano, Link Down
Pacerier

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 есть возможность кардинально изменить свой API, прежде чем перейти к финальной версии, что крайне нежелательно при написании кода (и даже при разработке). То есть, если нумерация версий соответствует рекомендациям semver.org .
Робин ван Баален

1
«умные» кавычки ('') оказываются не такими уж умными в js-файлах.
глиф

Мне нравится этот комментарий, потому что он показывает, где поставить имя базы данных
Борис Иванов

0

Вы можете пропустить ORM, сборщики и т. Д. И упростить управление БД / SQL с помощью sqlerи 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');
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.