1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yunwisdoms-xmysql

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Xmysql: одна команда для генерации REST API для любой базы данных MySql

Зачем это?

xmysql gif

Генерация REST API для базы данных MySql, которая не соответствует соглашениям таких фреймворков, как rails, django, laravel и т. д., — это небольшое приключение, которого хотелось бы избежать...

Поэтому это.

Установка и использование

Для работы с xmysql требуется версия node >= 7.6.0.

npm install -g xmysql
xmysql -h localhost -u mysqlUsername -p mysqlPassword -d databaseName
http://localhost:3000

Вот и всё! Просто и минималистично!

Счастливого хакеринга!

Пример: генерация REST API для Magento

Работает на популярных пакетах узлов: (express, mysql) => { xmysql }

xmysql gif

Повысьте свою хакерскую карму, поделившись:

Примечание: в запросе присутствуют элементы, которые не относятся к технической направленности, например, призывы поделиться ссылкой в социальных сетях. Эти элементы не были переведены. Реляционные таблицы

Xmysql автоматически определяет связи по внешнему ключу и предоставляет GET API.

Например, blogs — это родительская таблица, а comments — дочерняя. Вызов API приведёт ко всем комментариям для первичного ключа блога 103.

/api/blogs/103/comments

___ (три подчёркивания)

___ — если есть несколько первичных ключей, разделите их тремя подчёркиваниями, как показано ниже:

/api/payments/103___JM555205

Разбиение на страницы

_p и _size

_p указывает страницу, а _size — размер строк ответа. По умолчанию возвращается 20 записей и максимум 100 за один запрос GET к таблице.

/api/payments?_size=50
/api/payments?_p=2
/api/payments?_p=2&_size=50

Когда _size больше 100, количество записей по умолчанию равно 100 (то есть максимум).

Если _size меньше или равно нулю, количество записей по умолчанию составляет 20 (то есть минимум).

Сортировка по возрастанию / Сортировка

ASC

/api/payments?_sort=column1

например, сортирует по возрастанию по column1.

DESC

/api/payments?_sort=-column1

например, сортирует по убыванию по column1.

Несколько полей в сортировке

/api/payments?_sort=column1,-column2

например, сортировка по возрастанию column1 и по убыванию column2.

Фильтрация столбцов / Поля

/api/payments?_fields=customerNumber,checkNumber

например, получает только customerNumber и checkNumber в ответе каждой записи.

/api/payments?_fields=-checkNumber

например, получает все поля в строке таблицы, кроме checkNumber.

Строковая фильтрация / Где

Операторы сравнения

eq — '=' — (colName, eq, colValue) ne — '!=' — (colName, ne, colValue) gt — '>' — (colName, gt, colValue) gte — '>=' — (colName, gte, colValue) lt — '<' — (colName, lt, colValue) lte — '<=' — (colName, lte, colValue) is — 'is' — (colName, is, true/false/null) in — 'in' — (colName, in, val1, val2, val3, val4) bw — 'between' — (colName, bw, val1, val2) like — 'like' — (colName, like, ~name) (примечание: используйте ~). Chart

HOTNESS ALERT

Chart API возвращает распределение числового столбца в таблице.

Он представлен в СЕМИ мощных вариантах:

  1. Диаграмма: с min, max, step в параметрах запроса.

    Этот API возвращает количество строк, где сумма находится между (0, 25 000), (25 001, 50 000) и так далее.

/api/payments/chart?_fields=amount&min=0&max=131000&step=25000

Ответ:
[
  {
    "amount": "0 to 25000",
    "_count": 107
  },
  {
    "amount": "25001 to 50000",
    "_count": 124
  },
  {
    "amount": "50001 to 75000",
    "_count": 30
  },
  {
    "amount": "75001 to 100000",
    "_count": 7
  },
  {
    "amount": "100001 to 125000",
    "_count": 5
  },
  {
    "amount": "125001 to 150000",
    "_count": 0
  }
]

2. **Диаграмма**: со ступенчатым массивом в параметрах.

Этот API возвращает распределение между указанным массивом шагов.

/api/payments/chart?_fields=amount&steparray=0,10000,20000,70000,140000

Ответ: [ { "amount": "0 to 10000", "_count": 42 }, { "amount": "10001 to 20000", "_count": 36 }, { "amount": "20001 to 70000", "_count": 183 }, { "amount": "70001 to 140000", "_count": 12 } ]

  1. Диаграмма: со ступенчатыми парами в параметрах.

Этот API возвращает распределение между каждой парой шагов.

/api/payments/chart?_fields=amount&steppair=0,50000,40000,100000

Ответ:
[
    {"amount":"0 to 50000","_count":231},
    {"amount":"40000 to 100000","_count":80}
]

4. **Диаграмма**: без параметров.

Этот API определяет равномерное распределение числового столбца таблицы и возвращает данные.

/api/payments/chart?_fields=amount

Ответ: [ { "amount": "-9860 to 11100", "_count": 45 }, { "amount": "11101 to 32060", "_count": 91 }, { "amount": "32061 to 53020", "_count": 109 }, { "amount": "53021 to 73980", "_count": 16 }, { "amount": "73981 to 94940", "_count": 7 }, { "amount": "94941 to 115900", "_count": 3 }, { "amount": "115901 to 130650", "_count": 2 } ]

  1. Диаграмма: диапазон, min, max, шаг в параметрах запроса.

Этот API возвращает количество записей, где сумма составляет от (0, 25 000), от (0, 50 000) и т. д. до (0, maxValue).

Количество записей для суммы подсчитывается от минимального значения до расширенного диапазона, а не с шагом.

/api/payments/chart?_fields=amount&min=0&max=131000&step=25000&range=1

Ответ:
[
    {
        "amount": "0 to 25000",
        "_count": 107
    },
    {
        "amount": "0 to 50000",
        "_count": 231
    },
    {
        "amount": "0 to 75000",
        "_count": 261
    },
    {
        "amount": "0 to 100000",
        "_count": 268
    },
    {
        "amount": "0 to 125000",
        "_count": 273
    }
]

6. Диапазон можно указать с помощью ступенчатого массива, как показано ниже.

/api/payments/chart?_fields=amount&steparray=0,10000,20000,70000,140000&range=1

[ { "amount": "0 to 10000", "_count": 42 }, { "amount": "0 to 20000", "_count": 78 }, { ...


«amount»: «0 to 140000»,
    «_count»: 273
}
]
  1. Range can be specified without any step params like below

[
    {
        «amount»: «-9860 to 11100»,
        «_count»: 45
    },
    {
        «amount»: «-9860 to 32060»,
        «_count»: 136
    },
    ...
    
]

Please Note:
_fields in Chart API can only take numeric column as its argument.  

## Autochart

Identifies numeric columns in a table which are not any sort of key and applies chart API as before - feels like magic when there are multiple numeric columns in table while hacking/prototyping and you invoke this API.

```http://localhost:3000/api/payments/autochart

[
    {
        "column": "amount",
        "chart": [
                    {
                        "amount": "-9860 to 11100",
                        "_count": 45
                    },
                    {
                        "amount": "11101 to 32060",
                        "_count": 91
                    },
                    {
                        "amount": "32061 to 53020",
                        "_count": 109
                    },
                    {
                        "amount": "53021 to 73980",
                        "_count": 16
                    },
                    {
                        "amount": "73981 to 94940",
                        "_count": 7
                    },
                    {
                        "amount": "94941 to 115900",
                        "_count": 3
                    },
                    {
                        "amount": "115901 to 130650",
                        "_count": 2
                    }
                ]
    }
]

XJOIN

Xjoin query params and values:

alias.tableName :   TableName as alias
_j              :   Join [ _j => join, _ij => ij, _lj => left join , _rj => right join)
_onNumber       :   Number 'n' indicates condition to be applied for 'n'th join between (n-1) and 'n'th table in list  

Simple example of two table join:

Sql join query:

SELECT pl.field1, pr.field2
FROM productlines as pl
    JOIN products as pr
        ON pl.productline = pr.productline

Equivalent xjoin query API: /api/xjoin?_join=pl.productlines,_j,pr.products&_on1=(pl.productline,eq,pr.productline)&_fields=pl.field1,pr.field2

Multiple tables join

Sql join query:

SELECT pl.field1, pr.field2, ord.field3
FROM productlines as pl
    JOIN products as pr
        ON pl.productline = pr.productline
    JOIN orderdetails as ord
        ON pr.productcode = ord.productcode

Equivalent xjoin query API:

/api/xjoin?_join=pl.productlines,_j,pr.products,_j,ord.orderDetails&_on1=(pl.productline,eq,pr.productline)&_on2=(pr.productcode,eq,ord.productcode)&_fields=pl.field1,pr.field2,ord.field3

Explanation:

pl.productlines => productlines as pl _j => join pr.products => products as pl _on1 => join condition between productlines and products => (pl.productline,eq,pr.productline) _on2 => join condition between products and orderdetails => (pr.productcode,eq,ord.productcode)

Example to use : _fields, _where, _p, _size in query params

/api/xjoin?_join=pl.productlines,_j,pr.products&_on1=(pl.productline,eq,pr.productline)&_fields=pl.productline,pr.productName&_size=2&_where=(productName,like,1972~)

Response:

[{"pl_productline":"Classic Cars","pr_productName":"1972 Alfa Romeo GTA"}]

Please note : Xjoin response has aliases for fields like below aliasTableName + '_' + columnName.
eg: pl.productline in _fields query params - returns as pl_productline in response.

Run dynamic queries

:arrow_heading_up:

Dynamic queries on a database can be run by POST method to URL localhost:3000/dynamic

This is enabled ONLY when using local mysql server i.e -h localhost or -h 127.0.0.1 option.

Post body takes two fields : query and params.

query: SQL query or SQL prepared query (ones with ?? и ?)

params: параметры для SQL подготовленного запроса.

POST /dynamic   

    {
        "query": "select * from ?? limit 1,20",
        "params": ["customers"]
    }

POST /dynamic

URL может иметь любой суффикс, что может быть полезно при прототипировании. Например:

POST /dynamic/weeklyReport

или

POST /dynamic/user/update

Загрузка одного файла

:arrow_heading_up:

POST /upload

Выполните операцию POST на URL /upload с многокомпонентной формой «field», назначенной локальному файлу для загрузки.

Например: curl --form file=@/Users/me/Desktop/a.png http://localhost:3000/upload.

Возвращает имя загруженного файла или «загрузка не удалась».

(Примечание: у POSTMAN есть проблемы с загрузкой файлов, поэтому примеры приведены с использованием curl).

Загрузка нескольких файлов

:arrow_heading_up:

POST /uploads

Выполните операцию POST на /uploads URL с многокомпонентными формами «fields», назначенными локальным файлам для загрузки.

Обратите внимание на «s» рядом с /api/uploads и files в следующем примере:

например: curl --form files=@/Users/me/Desktop/a.png --form files=@/Users/me/Desktop/b.png http://localhost:3000/uploads.

возвращает имена загруженных файлов в виде строки.

Скачивание файла

:arrow_heading_up:

http://localhost:3000/download?name=fileName

Для загрузки и скачивания файлов вы можете указать папку хранилища с помощью опции -s. API для загрузки и скачивания доступны только с локальным сервером MySQL.

Здоровье

:arrow_heading_up:

http://localhost:3000/_health

{"process_uptime":3.858,"mysql_uptime":"2595"}

Показывает время работы процесса Xmysql и сервера MySQL.

http://localhost:3000/_health?details=1

{"process_uptime":1.151,"mysql_uptime":"2798",
"os_total_memory":17179869184,
"os_free_memory":2516357120,
"os_load_average":[2.29931640625,2.1845703125,2.13818359375],
"v8_heap_statistics":{"total_heap_size":24735744,
"total_heap_size_executable":5242880,
"total_physical_size":23521048,
"total_available_size":1475503064,
"used_heap_size":18149064,
"heap_size_limit":1501560832,
"malloced_memory":8192,
"peak_malloced_memory":11065664,
"does_zap_garbage":0}}

Предоставляет более подробную информацию о процессе.

Фактически передача любого параметра запроса даёт подробный вывод о работоспособности: пример ниже.

http://localhost:3000/_health?voila

{"process_uptime":107.793,"mysql_uptime":"2905","os_total_memory":17179869184,"os_free_memory":2573848576,"os_load_average":[2.052734375,2.12890625,2.11767578125],"v8_heap_statistics":{"total_heap_size":24735744,"total_heap_size_executable":5242880,"total_physical_size":23735016,"total_available_size":1475411128,"used_heap_size":18454968,"heap_size_limit":1501560832,"malloced_memory":8192,"peak_malloced_memory":11065664,"does_zap_garbage":0}}

Версия

:arrow_heading_up:

http://localhost:3000/_version

{"Xmysql":"0.4.1","mysql":"5.7.15","node":"8.2.1"}

Когда использовать?

:arrow_heading_up:

  • Вам нужны только REST API для (ЛЮБОЙ) базы данных MySql в мгновение ока (буквально).
  • Вы изучаете новые интерфейсные фреймворки и вам нужны REST API для вашей базы данных MySQL.
  • Вы работаете над демонстрацией, хаками и т. д.

Когда НЕ использовать?

:arrow_heading_up:

  • Если вам нужна полноценная инфраструктура MVC, ACL, проверки, авторизация и т.д., то это только начало, пожалуйста, следите за этим репозиторием или добавьте его в избранное, чтобы быть в курсе прогресса.

Параметры командной строки

:arrow_heading_up:

  Options:

    -V, --version            Output the version number
    -h, --host <n>           Hostname of database -> localhost by default
    -u, --user <n>           Username of database -> root by default
    -p, --password <n>       Password of database -> empty by default
    -d, --database <n>       database schema name
    -r, --ipAddress <n>      IP interface of your server / localhost by default    
    -n, --portNumber <n>     Port number for app -> 3000 by default
    -o, --port <n>           Port number of mysql -> 3306 by default
    -a, --apiPrefix <n>      Api url prefix -> /api/ by default
    -s, --storageFolder <n>  Storage folder -> current working dir by default **Использование xmysql**

-i, --ignoreTables <n>   Comma separated table names to ignore
-c, --useCpuCores <n>    Specify number of cpu cores to use / 1 by default / 0 to use max
-y, --readOnly           readonly apis -> false by default    
-h, --help               Output usage information

**Примеры:**

$ xmysql -u username -p password -d databaseSchema

Boost Your Hacker Karma By Sharing :

Docker

:arrow_heading_up:

Просто запустите с помощью команды docker run -p 3000:80 -d markuman/xmysql:0.4.2.

Лучший способ тестирования — запустить MySQL в контейнере Docker и создать сеть Docker, чтобы xmysql мог получить доступ к контейнеру MySQL по имени из сети Docker.

  1. Создайте сеть:
    • docker network create mynet.
  2. Запустите MySQL с именем контейнера some-mysql и подключитесь к сети Docker mynet:
    • docker run --name some-mysql -p 3306:3306 --net mynet -e MYSQL_ROOT_PASSWORD=password -d markuman/mysql.
  3. Запустите xmysql и задайте переменную окружения для some-MySQL из шага 2:
    • docker run -p 3000:80 -d -e DATABASE_HOST=some-mysql --net mynet markuman/xmysql.

Также можно передать переменные окружения в файл и использовать их как опцию с Docker, например: docker run --env-file ./env.list -p 3000:80 --net mynet -d markuman/xmysql.

Можно использовать следующие переменные среды:

ENV **DATABASE_HOST 127.0.0.1**

**ENV DATABASE_USER root**

**ENV DATABASE_PASSWORD password**

**ENV DATABASE_NAME sakila**

Кроме того, контейнер Docker xmysql слушает порт 80. Вы можете запросить его просто с помощью `http://xmysql/api/` в других сервисах, работающих в той же сети Docker.

## Отладка xmysql в Docker

Предположим, вы развернули свой контейнер Docker xmysql следующим образом:

```shell
docker run -d \
--network local_dev \
--name xmysql \
-p 3000:80 \
-e DATABASE_HOST=mysql_host \
-e DATABASE_USER=root \
-e DATABASE_PASSWORD=password \
-e DATABASE_NAME=sys \
markuman/xmysql:0.4.2

Но ответ будет таким:

["http://127.0.0.1:3000/api/tables","http://127.0.0.1:3000/api/xjoin"]

Тогда очевидно, что соединение с вашей базой данных MySQL не удалось.

  1. Прикрепите к образу xmysql:
    • docker exec -ti xmysql
  2. Установите клиент MySQL CLI:
    • apk --update --no-cache add mysql-client
  3. Попробуйте получить доступ к вашей базе данных MySQL:
    • mysql-client -h mysql_host
  4. Воспользуйтесь выводом ошибок клиента MySQL и улучшите переменные среды для MySQL.

Конфигурация обратного прокси Nginx с Docker

:arrow_heading_up:

Это пример конфигурации, когда вы используете Nginx в качестве обратного прокси.

events {
   worker_connections 1024;
}
http {
    server {
        server_name 127.0.0.1;
        listen 80 ;
        location / {
            rewrite ^/(.*) /$1 break;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:3000;
        }
    }
}

Например:

  1. Создайте сеть Docker docker network create local_dev.
  2. Запустите сервер MySQL docker run -d --name mysql -p 3306:3306 --network local_dev -e MYSQL_ROOT_PASSWORD=password mysql.
  3. Запустите xmysql docker run -d --network local_dev --name xmyxql -e DATABASE_NAME=sys -e DATABASE_HOST=mysql -p 3000:80 markuman/xmysql:0.4.2.
  4. Запустите Nginx на хост-системе с указанной конфигурацией sudo nginx -g 'daemon off;' -c /tmp/nginx.conf.
  5. Получите результат curl http://127.0.0.1/api/host_summary_by_file_io_type/describe.

Когда вы запускаете свой прокси-сервер Nginx в контейнере Docker, используйте в качестве proxy_pass значение --name xmysql. Например, proxy_pass http://xmysql (помните, xmysql уже работает в своём контейнере на порту 80).

Тесты: настройка на локальном компьютере

:arrow_heading_up:

docker-compose run test
  • Требуется установить docker-compose на вашем компьютере.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Автоматическое создание REST API для MySQL. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/yunwisdoms-xmysql.git
git@api.gitlife.ru:oschina-mirror/yunwisdoms-xmysql.git
oschina-mirror
yunwisdoms-xmysql
yunwisdoms-xmysql
master