Михаил Говори
На этой неделе я наткнулся на «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 здесь Отказ
- Мы создадим драйвер с нашим адресом, пользователем и паролем и получим сеанс, который мы используем для запуска запроса.
- Получите результаты и выведите клавиши записи первой строки в качестве заголовков и значений всех записей в виде рядов, все разделенные вкладки.
- Внизу мы также выводим общее количество строк и время, взятые из результата-резюме.
(Обратите внимание, что драйвер 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/”