Рубрики
Без рубрики

Как написать клиент базы данных командной строки всего за 10 минут с использованием OCLIF с помощью Teadercript

Michael Hunger Как написать клиент базы данных командной строки всего за 10 минут с использованием OCLIF с типприппризорами, которую я наткнулся на «OCLIF, командной строки с открытым исходным кодом» Saleforce / Heroku в среднем посте JEFF DICKEY. Я был заинтригован, это выглядело очень легко и чисто (благодаря

Михаил Говори

На этой неделе я наткнулся на «OCLIF, командные строки с открытым исходным кодом » Salesforce/Heroku в среднем посте Джефф Дики Отказ

Я был заинтригован, это выглядело очень легко и чисто (благодаря типеприктору), и я знал от прошлого опыта, что в клире участвует много детей и ботина. Документация И примеры также выглядели действительно хорошо.

Я провел хорошее количество времени как в Neo4J-Shell, так и Cypher-Shell , как в Java, поэтому я хотел дать JavaScript (JS).

Использовав neo4j-javascript-драйвер Перед визуализацией графика я знал, что это довольно просто и быстро.

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

Для красивого вывода я выбрал ascii-таблица , аккуратная библиотека JS для производства симпатичных таблиц для терминала.

По сути, вы должны предоставить Болт-URL , Имя пользователя, и пароль и а Запрос Запустить, поэтому я представляю, что наш клиент выглядит так.

boltsh -a bolt://host:port -u neo4j -p pa55w0rd \  "MATCH (n:Person) RETURN n.name, n.age LIMIT 10"

видео

Я записал сеанс выполнения этого кодирования. Это доходит до 15-минутного времени выполнения, в основном из-за печати. Не стесняйтесь смотреть на него в 2x:)

Запуск экземпляра Neo4j

Чтобы получить NEO4J с некоторыми данными, у вас есть два варианта. Вы можете установить Neo4J Desktop , который является электронным приложением для управления базами данных и создание проекта с локальной пустой базой данных. Или вы можете запустить Neo4j Sandbox И выбрал «пустой песочницу».

Обратите внимание на IP-адрес сервера и болт порт, а также имя пользователя и пароль из вкладки «Детали».

В обоих случаях после запуска «Browser Neo4j», который является просто приятным интерфейсом на основе RACTED (а также использует драйвер Neo4j-JavaScript), введите и запустите в верхней команде.

:play movie graph

Это дает вам слайд-шоу, где на второй странице вы видите огромное заявление для создания образца данных. Нажмите и запустите это, и вы должны увидеть Том Хэнкс, визуализируемый с кучей его фильмов и некоторыми директорами.

Начало работы с OCLIF

Это очень просто – просто решайте, хотите ли вы, чтобы вы нужны много или однологовой клиент и запустите соответствующие NPX (NPM Package Runner) Команда.

npx oclif single boltsh

Это задает вам несколько вопросов о имени, лицензии и GitHub-Reppo и генерирует скелет в нашем случае для одной команды CLI.

Чтобы увидеть, что все сработало, вы можете запустить ./bin/run Команда и должна увидеть вывод, как это:

./bin/run
hello world from /Users/mh/d/js/boltsh/src/index.ts!

ОК, поэтому мы можем найти код для редактирования в этом файле, который является Команда класс. Открывая его в редакторе, мы видим, где добавить описание, пример использования и Флаги упомянутый выше.

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

import { Command, flags } from '@oclif/command'
class Boltsh extends Command {  static description = 'Execute Cypher Queries via Bolt'
  static examples = [    `$ boltsh -a bolt://localhost -u neo4j -p test \                 "MATCH (n:Person) return n.name"n.nameKeanu ReevesTom Hanks...`,  ]
  static flags = {    version: flags.version({ char: 'v' }),    help: flags.help({ char: 'h' }),
    address: flags.string({ char: 'a', description: 'bolt address',                       required: true, default: 'bolt://localhost' }),    user: flags.string({ char: 'u', description: 'neo4j user',                      required: true, default: 'neo4j' }),    password: flags.string({ char: 'p', required: true,                      description: 'user password' }),  }
  static args = [{ name: 'query', required: true,                    description: 'Cypher Query to Run' }]
  async run() {    const { args, flags } = this.parse(Boltsh)
    this.log(`boltsh: ${flags.address} ${flags.user}               ${args.query} from ${__filename}!`)  }}
export = Boltsh

Таким образом, мы выводим наши входы командной строки и дайте ей. Как хороший побочный эффект, Беги Команда также запускает Tymdercript Compiler, поэтому нам не нужно делать это вручную.

./bin/run -p test "MATCH (n:Person) RETURN n.name"
boltsh: bolt://localhost neo4j MATCH (n:Person) RETURN n.name from /Users/mh/d/js/boltsh/src/index.ts!

Cool, теперь мы можем добавить Neo4J-драйвер и отправьте наш запрос на сервер:

yarn add neo4j-driver

Добавить импорт сверху:

import * as neo4j from 'neo4j-driver'

Вы найдете детали Neo4j драйвера API здесь Отказ

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

(Обратите внимание, что драйвер Neo4j использует свой тип собственного типа для номеров, так как JavaScript не может выразить 64-битные номера.)

async run() {  const { args, flags } = this.parse(Boltsh)
  const driver = neo4j.v1.driver(flags.address,                    neo4j.v1.auth.basic(flags.user, flags.password))  const session = driver.session()  const result = await session.run(args.query)  session.close()  driver.close()  const records = result.records;  if (records.length > 0) {    // header    this.log(records[0].keys.join("\t"))    // rows    records.forEach(r => this.log(                    r.keys.map(k => r.get(k)).join("\t")))
    this.log(`Returned ${records.length} row(s) in              ${result.summary.resultAvailableAfter.toNumber() +                result.summary.resultConsumedAfter.toNumber()} ms.`)  } else {    this.log('No Results.')  }}

Если мы снова запустим наш тест, это «просто работает». Прохладный!

./bin/run -p test "MATCH (n:Person) RETURN n.name limit 2"
n.nameKeanu ReevesCarrie-Anne MossReturned 2 row(s) in 3 ms.

Теперь мы можем сделать это красивым с ascii-таблица

yarn add ascii-table

Поскольку таблица ASCII не поставляется с определением TypeScript, компилятор ошибся – именно поэтому мы должны объявить модуль в отдельном файле `SRC/Ambient.d.ts`

declare module 'ascii-table';

Опять же, добавьте импорт. На этот раз мы добавляем не требуемый флаг -t который включает в режим таблицы.

import * as AsciiTable from 'ascii-table'

Затем мы строим и вывод Asciiable экземпляр вместо простого текста, когда этот флаг установлен.

static flags = {  // ...  table: flags.boolean({ char: 't', description: 'Table Format' })}
async run() {  const { args, flags } = this.parse(Boltsh)
  const driver = neo4j.v1.driver(flags.address,                   neo4j.v1.auth.basic(flags.user, flags.password))  const session = driver.session()  const result = await session.run(args.query)  session.close()  driver.close()  const records = result.records;
  if (records.length > 0) {    // extract data to be rendered    const data = { heading: records[0].keys,           rows: records.map(r => r.keys.map(k => r.get(k))) }
    if (flags.table) {      const table = AsciiTable.factory(data)      this.log(table.toString())    } else {      this.log(data.heading.join("\t"))      data.rows.forEach(r => this.log(r.join("\t")))    }
    this.log(`Returned ${records.length} row(s) in              ${result.summary.resultAvailableAfter.toNumber() +                  result.summary.resultConsumedAfter.toNumber()} ms.`)  } else {    this.log('No Results.')  }}

Так что давайте давайте попробуем и посмотрим, как выглядит наш стол:

./bin/run -p test -t "MATCH (n:Person) RETURN n.name limit 10"
.--------------------.|       n.name       ||--------------------|| Keanu Reeves       || Carrie-Anne Moss   || Laurence Fishburne || Hugo Weaving       || Lilly Wachowski    || Lana Wachowski     || Joel Silver        || Emil Eifrem        || Charlize Theron    || Al Pacino          |'--------------------'Returned 10 row(s) in 25 ms.

Кроме того, более сложный запрос выглядит хорошо (кроме, это слишком широкое для среднего, поэтому скриншот). Это оказывает название людей, рождения, и три фильма, которые они связаны.

Что приятно о OCLIF – это то, что он поставляется с аккумуляторами. Например, мы можем запустить Болтш --help Чтобы получить правильную страницу справки:

./bin/run --helpExecute Cypher Queries via Bolt
USAGE  $ boltsh QUERY
ARGUMENTS  QUERY  Cypher Query to Run
OPTIONS  -a, --address=address    (required) [default: bolt://localhost] bolt address  -h, --help               show CLI help  -p, --password=password  (required) user password  -u, --user=user          (required) [default: neo4j] neo4j user  -v, --version            show CLI version
EXAMPLE  $ boltsh -a bolt://localhost -u neo4j -p test \           "MATCH (n:Person) return n.name"  n.name  Keanu Reeves  Tom Hanks  ...

В статье, упомянутой в начале начала, Джефф показывает, как построить многокомандую CLI. Код в основном такой же, как наше, единственное различие в том, что у вас есть несколько команд.

Проверьте Oclif Документация и Примеры Отказ

Рамочная структура имеет инфраструктуру плагинов, и уже есть Несколько плагинов , как самообслуживание. Я надеюсь, что мы увидим больше.

Я думаю, что OCLIF действительно красиво делается у людей в Героку, благодаря Джеффу Дики.

Круто, миссия выполнена, теперь все, что остается, – это подтолкнуть Github и Опубликовать на НПМ Отказ

Так почему бы тебе не попробовать и построить свой собственный?

Счастливый взлом!

Оригинал: “https://www.freecodecamp.org/news/writing-a-command-line-database-client-in-10-minutes-aa608536ae4b/”