Мне нужен справочник для сравнения простых способов настройки и использования баз данных с узлом, чтобы было легче думать о решениях, не зависящих от базы данных.
Базы данных
- Постгрес
- МарияДБ / 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"