Генерация 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
Вот и всё! Просто и минималистично!
Счастливого хакеринга!
Работает на популярных пакетах узлов: (express, mysql) => { xmysql }
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 возвращает распределение числового столбца в таблице.
Он представлен в СЕМИ мощных вариантах:
Диаграмма: с 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 } ]
Этот 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 } ]
Этот 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
}
]
[
{
«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
}
]
}
]
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
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
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.
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
POST /upload
Выполните операцию POST на URL /upload с многокомпонентной формой «field», назначенной локальному файлу для загрузки.
Например: curl --form file=@/Users/me/Desktop/a.png http://localhost:3000/upload.
Возвращает имя загруженного файла или «загрузка не удалась».
(Примечание: у POSTMAN есть проблемы с загрузкой файлов, поэтому примеры приведены с использованием curl).
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.
возвращает имена загруженных файлов в виде строки.
http://localhost:3000/download?name=fileName
Для загрузки и скачивания файлов вы можете указать папку хранилища с помощью опции -s. API для загрузки и скачивания доступны только с локальным сервером MySQL.
{"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}}
http://localhost:3000/_version
{"Xmysql":"0.4.1","mysql":"5.7.15","node":"8.2.1"}
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
Просто запустите с помощью команды docker run -p 3000:80 -d markuman/xmysql:0.4.2
.
Лучший способ тестирования — запустить MySQL в контейнере Docker и создать сеть Docker, чтобы xmysql
мог получить доступ к контейнеру MySQL
по имени из сети Docker.
docker network create mynet
.some-mysql
и подключитесь к сети Docker mynet
:
docker run --name some-mysql -p 3306:3306 --net mynet -e MYSQL_ROOT_PASSWORD=password -d markuman/mysql
.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 не удалось.
docker exec -ti xmysql
apk --update --no-cache add mysql-client
mysql-client -h mysql_host
Это пример конфигурации, когда вы используете 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;
}
}
}
Например:
docker network create local_dev
.docker run -d --name mysql -p 3306:3306 --network local_dev -e MYSQL_ROOT_PASSWORD=password mysql
.docker run -d --network local_dev --name xmyxql -e DATABASE_NAME=sys -e DATABASE_HOST=mysql -p 3000:80 markuman/xmysql:0.4.2
.sudo nginx -g 'daemon off;' -c /tmp/nginx.conf
.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).
docker-compose run test
docker-compose
на вашем компьютере.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )