MySQL com Node.js

376

Eu apenas comecei a entrar no Node.js. Eu sou formado em PHP e estou acostumado a usar o MySQL para todas as minhas necessidades de banco de dados.

Como posso usar o MySQL com Node.js?

rastejar
fonte
5
com o que você acabou indo? há alguma informação boa abaixo, eu estaria interessado em ouvir o que suas experiências foram
Landon
7
O @Landon, na verdade, foi com o node-mysql por algumas razões, principalmente porque está em desenvolvimento bastante ativo e parece ser o mais amplamente usado. Eu também gosto muito da multipleStatementsfunção.
crawf
@crawf O que você prefere, PHP ou Node.js? Eu pulei em PHP / MySQL, mas estou pensando em mudar para o nó uma vez que seria prolly sente muito mais natural considerando a sintaxe é JS sintaxe
Oldboy
11
@Anthony Preferência pessoal Suponho que depende do ecossistema em que você está se desenvolvendo, se você está em uma equipe etc. e trabalho de back-end. Eu diria que se você tiver tempo para dar uma chance ao Node, e ele é ótimo emparelhado com coisas como socket.io para soquetes da web em tempo real.
crawf 21/03/18

Respostas:

427

Confira a lista de módulos node.js.

  • node-mysql - Um módulo node.js implementando o protocolo MySQL
  • node-mysql2 - Mais um driver assíncrono JS puro. Pipelining, declarações preparadas.
  • node-mysql-libmysqlclient - Ligações assíncronas do MySQL baseadas em libmysqlclient

O node-mysql parece bastante simples:

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

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

Consultas:

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'
mak
fonte
81
+1 para o nó-mysql realmente tornando-se mais fácil de usar declarações preparadas do que não usá-los
Kevin Leigos
2
github.com/bminer/node-mysql-queues para transações e suporte a múltiplas instruções para uso com o node-mysql.
BMiner
2
+1 para node-mysql também. O que pode melhor do que apenas requireing uma biblioteca javascript
Alex K
4
@KevinLaity Fiquei com a impressão de que o node-mysql ainda não possui instruções preparadas implementadas. A sintaxe é parecida . Em vez disso, parece que, por enquanto, caracteres especiais estão sendo escapados.
funseiki
4
Além disso, você pode obter o nome do seu banco de dados adicionando 'banco de dados' ao objeto de conexão
felipekm
29

O node-mysql é provavelmente um dos melhores módulos usados ​​para trabalhar com o banco de dados MySQL, que é mantido ativamente e bem documentado.

yojimbo87
fonte
20

Como esse é um thread antigo, basta adicionar uma atualização:

Para instalar o driver node.js do MySQL:

Se você executar apenas npm install mysql, precisará estar no mesmo diretório que o seu servidor. Eu recomendaria fazê-lo como em um dos seguintes exemplos:

Para instalação global:

npm install -g mysql

Para instalação local:

1- Adicione ao seu package.jsonnas dependências:

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

2- executar npm install


Observe que, para que as conexões aconteçam, você também precisará estar executando o servidor mysql (que é independente do nó)

Para instalar o servidor MySQL:

Existem vários tutoriais por aí que explicam isso, e isso depende um pouco do sistema operacional. Basta ir ao google e procurar how to install mysql server [Ubuntu|MacOSX|Windows]. Mas em uma frase: você precisa ir para http://www.mysql.com/downloads/ e instalá-lo.

fmsf
fonte
3
npm install --save mysqlirá instalá-lo e adicioná-lo ao seu package.jsonautomaticamente
Xeoncross 10/10
11

Aqui está o código de produção que pode ajudá-lo.

Package.json

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

Aqui está o arquivo do servidor.

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

Referência: https://codeforgeek.com/2015/01/nodejs-mysql-tutorial/

Shaikh Shahid
fonte
Este código parece estragado .. muitos erros incluindoCannot read property 'release' of undefined
Pacerier
4

Imo, você deve tentar o MySQL Connector / Node.js, que é o driver oficial do Node.js. para o MySQL. Veja ref-1 e ref-2 para explicação detalhada. Eu tentei o mysqljs / mysql, que está disponível aqui , mas não encontro documentação detalhada sobre classes, métodos, propriedades desta biblioteca.

Então, mudei para o padrão MySQL Connector/Node.jscom X DevAPI, pois é uma biblioteca de clientes assíncrona baseada em Promise e fornece boa documentação. Dê uma olhada no seguinte trecho de código:

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);
});
Lex Soft
fonte
3

KnexJs pode ser usado como um construtor de consultas SQL no Node.JS e no navegador. Acho fácil de usar. Vamos tentar - 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'
  }
});

Você pode usá-lo assim

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

ou

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

Você também pode tentar um novo esforço conhecido como Node.js DB, que visa fornecer uma estrutura comum para vários mecanismos de banco de dados. Ele é construído com C ++ para garantir o desempenho.

Especificamente, você pode usar seu driver db-mysql para suporte ao Node.js. MySQL .

Mariano Iglesias
fonte
11
Obrigado! Eu também vou tentar.
crawf
4
O node-db não é mais suportado (inativo por 8 meses, usa o node-waf descontinuado) e a instalação falhou para mim.
Yogu
18
"Ele é construído com C ++ para garantir o desempenho" - o simples uso do C ++ não garante o desempenho, mas ainda precisa ser programado corretamente.
developerbmw
Não é apenas o node-db não suportado, o link está morto - redirecionado para algum tipo de site de anúncio agora. Downvoting.
Nurdglaw
2
@Mariano, Link Down
Pacerier
0

conecte o banco de dados mysql instalando uma biblioteca. aqui, escolheu o módulo node-mysql estável e fácil de usar.

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

Para o NodeJS mysql, exemplo de conexão e consulta

Prabin Tp
fonte
2
Tanto quanto sei, os lançamentos alfa nunca devem ser considerados "estáveis". Corrija-me se eu estiver errado. O Alpha tem a possibilidade de alterar drasticamente sua API antes de ir para a final, o que é altamente indesejado no código de produção (e até desenvolvimento). Ou seja, se a numeração da versão seguir as diretrizes do semver.org .
Robin van Baalen
11
aspas "inteligentes" ('') não são tão inteligentes em arquivos js.
glyph
Eu gosto desse comentário porque mostra onde colocar o nome do banco de dados
Boris Ivanov
0

Você pode pular o ORM, construtores, etc. e simplificar o gerenciamento de DB / SQL usando sqlere 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');
});
ugate
fonte