Мне нужен справочник для сравнения простых способов настройки и использования баз данных с узлом, чтобы было легче думать о решениях, не зависящих от базы данных.

Базы данных

  • Постгрес
  • МарияДБ / MySQL
  • MongoDB
  • Firestore // TODO
  • Эластичный поиск
  • Редис
  • (Кассандра, dynamodb, sqlite3, Db2) // TODO

Постгрес

Настраивать:

docker run --net=host --name postgres --env POSTGRES_PASSWORD=password postgres
docker exec -it postgres psql -h localhost -U postgres
#> CREATE DATABASE test;
npm install postgres

Доступ:

const postgres = require('postgres');
const sql = postgres({username: 'postgres', password: 'password', database: 'test'});
await sql`CREATE TABLE IF NOT EXISTS things (x INTEGER)`;
await sql`INSERT INTO things(x) VALUES (5)`;
await sql`SELECT * FROM things`
# [ { x: 5 } ]

MariaDB (примечание: docker mysql не работает на ARM)

Настройка (обратите внимание, что клиенты и серверы mariadb/mysql совместимы):

docker run --net=host --name mariadb --env MARIADB_ROOT_PASSWORD=password mariadb
docker exec -it mariadb mysql -p
#> CREATE DATABASE test;
npm install mysql2 # or mariadb

Доступ:

const mysql = require('mysql2/promise'); // or mariadb/promise
var connection = await mysql.createConnection({ host: 'localhost', user: 'root', database: 'test', password: 'password' })
await connection.query('CREATE TABLE IF NOT EXISTS things (x INTEGER)')
await connection.query('INSERT INTO things(x) VALUES (5)')
await connection.query('SELECT * FROM things')
# [ [ TextRow { x: 5 } ], [ ColumnDefinition ... ] ]

Sequalize (с любой базой данных SQL)

Настраивать:

То же, что Postgres / MariaDB (также установите соответствующий пакет npm)

Доступ:

const { Sequelize, Model, DataTypes } = require('sequelize');
var sequelize = new Sequelize('mysql://root:password@localhost/test');
// or const sequelize = new Sequelize('postgres://postgres:password@localhost/test')
await sequelize.authenticate();
const Thing = sequelize.define('Thing', { x: { type: DataTypes.INTEGER } })
await Thing.sync()
await Thing.create({x: 5})
await Thing.findAll()
# [ Thing { id: 1, x: 5, createdAt: 2021-09-20T00:54:39.000Z, updatedAt: 2021-09-20T00:54:39.000Z, } ]

MongoDB

Настраивать:

docker run --net=host --name mongo mongo

Доступ:

const { MongoClient } = require('mongodb');
const url = 'mongodb://localhost:27017';
const client = new MongoClient(url);
const dbName = 'test';
await client.connect();
const db = client.db();
const collection = db.collection('things');
await collection.insertOne({x: 5})
# { acknowledged: true, insertedId: new ObjectId("6147d4f06aab7ff6c8188a89") }
await collection.find().toArray()
# [ { _id: new ObjectId("6147d4f06aab7ff6c8188a89"), x: 5 }, ]

Эластичный поиск

Настраивать:

sudo sysctl -w vm.max_map_count=262144 && sudo systemctl restart docker
docker run --net=host --name es -e "discovery.type=single-node" elastic/elasticsearch:7.15.1
# note -- this will fail with no logs if there is not enough memory
# add `-e ES_JAVA_OPTS="-Xms500m -Xmx500"` to use less memory

Доступ:

const { Client } = require('@elastic/elasticsearch')
const client = new Client({ node: 'https://localhost:9200' })
await client.index({index: 'things', body: { x: 5 } })
await client.search({index: "things"})
// { body: { hits: { hits: [ { _id: 'IdAjAXwB1JURAYIslcjp', _source: { _x: 5 } } ] } } }

Редис

Настраивать:

docker run --net=host --name redis redis

Доступ:

const redis = require("redis");
const client = redis.createClient();
const { promisify } = require("util");
const setAsync = promisify(client.set).bind(client);
const getAsync = promisify(client.get).bind(client);
await setAsync("key", "value")
await getAsync("key")
// "value"