MySQL з Node.js


375

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

Як я можу використовувати MySQL з Node.js?


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

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

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

1
@ Антоні Особисті переваги, я думаю, це залежить від екосистеми, в якій ви розвиваєтесь, якщо ви в команді тощо. Цей оригінальний пост є давнім, і багато що змінилося в ландшафті Вузла, де його набагато більше звичного для фронту і робота на задньому кінці. Я б сказав, якщо у вас є час, щоб перейти до Node, і він чудово поєднується з такими речами, як socket.io для веб-розеток у реальному часі.
crawf

Відповіді:


426

Перевірте список модулів 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 також для node-mysql. Що може бути краще, ніж просто користуватися requireбібліотекою javascript
Alex K

4
@KevinLaity У мене було враження, що node-mysql ще не виконано підготовлених операторів. Синтаксис просто схожий . Натомість, здається, що наразі вникають спеціальні символи.
funseiki

4
Крім того, ви можете отримати ім'я бази даних, додавши "базу даних" до об'єкта підключення
felipekm

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
накрутив

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

3

Імо, ви повинні спробувати 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);
});

1

Ви також можете спробувати новіші зусилля, відомі як DB Node.js, які спрямовані на створення загальної основи для декількох двигунів бази даних. Він побудований на C ++, тому продуктивність гарантована.

Зокрема, ви можете використовувати його драйвер db-mysql для підтримки Node.js MySQL .


1
Дякую! Я теж піду.
crawf

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

18
"Він побудований на C ++, тому продуктивність гарантована" - просто використання C ++ не гарантує продуктивність, його все одно потрібно правильно програмувати.
developerbmw

Підтримка node-db не тільки не підтримується, а посилання є мертвим-ish - перенаправляється на якийсь рекламний сайт зараз. Схильність
годувальниця

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

1
"розумні" цитати ('') виявляються не такими розумними у js-файлах.
гліф

Мені подобається цей коментар, оскільки він показує, куди слід розмістити ім’я бази даних
Борис Іванов

0

Ви можете пропустити ORM, будівельників тощо та спростити управління DB / 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.