create table pg_temp.test(
id serial primary key,
title text,
author_id int,
created date
);
insert into pg_temp.test (title, author_id, created)
select md5(random()::text),(100*random())::int,now() - '1 day'::interval * (random()::int * 100 + 100)
from generate_series(1,10)
DOCKER
запустить Докер-контейнер
$ docker run container_name
список всех запущенных контейнеров
$ docker ps
список всех контейнеров
$ docker ps -a
остановить контейнер
$ docker stop container_name
удалить контейнер
$ docker rm container_name|container_id
удалить много контейнеров
$ docker rm $(docker ps -a -q -f status=exited)
Эта команда удаляет все контейнеры, у которых статус exited
. Флаг -q
возвращает только численные ID, а флаг -f
фильтрует вывод на основе предоставленных условий. Последняя полезная деталь — команде docker run
можно передать флаг --rm
, тогда контейнер будет автоматически удаляться при завершении. Это очень полезно для разовых запусков и экспериментов с Докером.
Запустить Докер и сделать порты публичными, открепить терминал от запущенного контейнера.
$ docker run -d -P conteiner_name
Сниппет для TreeTable для подсчета выделенных строк
Генерация SVG на стороне сервера в php
Для того, чтобы создать SVG в php стоит воспользоваться этой замечательной библиотекой.
Проверка, входит ли узел дерева Cement (code=5) в Construction Material/Fixtures(code=1)
WITH RECURSIVE sub_category(code, name, parent_code, level) AS (
SELECT code, name, parent_code, 1 FROM goods_category WHERE code=5 /* код проверяемого элемента */
UNION ALL
SELECT c.code, c.name, c.parent_code, level+1
FROM goods_category c, sub_category sc
WHERE c.code = sc.parent_code
)
SELECT CASE WHEN exists(SELECT 1 FROM sub_category WHERE code=2 /*код корня поддерева, куда проверяется вхождение*/)
THEN 'true'
ELSE 'false'
END
Путь к узлу от корня
WITH RECURSIVE sub_category(code, name, parent_code, level) AS (
SELECT code, name, parent_code, 1 FROM goods_category WHERE code=5 /* код узла */
UNION ALL
SELECT c.code, c.name, c.parent_code, level+1
FROM goods_category c, sub_category sc
WHERE c.code = sc.parent_code
)
SELECT code, name, parent_code, (SELECT max(level) FROM sub_category) - level AS distance FROM sub_category;
Выборка поддерева по заданному узлу
WITH RECURSIVE sub_category(code, name, parent_code, level) AS (
SELECT code, name, parent_code, 1 FROM goods_category WHERE code=1 /* код заданного узла поддерева */
UNION ALL
SELECT c.code, c.name, c.parent_code, level+1
FROM goods_category c, sub_category sc
WHERE c.parent_code = sc.code
)
SELECT code, name, parent_code, level FROM sub_category;
Файл автокомплитов sublime-text для Webix
Создать файл с именем webix.sublime-completions
и поместить его в /home/здесь имя пользователя/.config/sublime-text-3/Packages/User (если вы в linux)
{
"scope": "source.js",
"completions":
[
{ "trigger": "console", "contents": "console.log(\"$1\",$0);" },
{ "trigger": "message", "contents": "webix.message({type:'error', text:'$1'});" },
{ "trigger": "text", "contents": "{ view:\"text\", name:\"$1\", label:\"\" }" },
{ "trigger": "combo", "contents": "{ view:\"combo\", name:\"$1\", label:\"\", options:[]}" },
{ "trigger": "richselect", "contents": "{ view:\"richselect\", name:\"$1\", label:\"\" , options:[]}"},
{ "trigger": "button", "contents": "{ view:\"button\", label:\"$1\", click: () => {} }" },
{ "trigger": "form", "contents": "{ view:\"form\", elements:[\n\t\"$1\"\n] }" },
{ "trigger": "cols", "contents": "{ cols:[\n\t$1\n] }" },
{ "trigger": "rows", "contents": "{ rows:[\n\t$1\n] }" },
{ "trigger": "getservice", "contents": "this.app.getService('$1').getValue();" },
{ "trigger": "setservice", "contents": "this.app.setService('$1',{\n\tgetValue: () => {\n\t\t\n\t}\n});" },
{ "trigger": "waitSave", "contents": "waitSave(() => {\n\t\n}).then((obj) => {\n\tconsole.log(obj);\n});" },
{ "trigger": "callEvent", "contents": "this.app.callEvent(\"$1\", []);" },
{ "trigger": "on", "contents": "this.on(this.app, \"eventName\", () => {\n\tdo_somethin();\n});" },
{ "trigger": "loadBranch", "contents": "loadBranch($1,null,\"server/\")\n.then( (data) => {\n\t\n});" },
{ "trigger": "ajax", "contents": "webix.ajax().get(\"server/.php\",{\n\tcmd:\"set_\",\n\tparam: param\n}).then((data) => {\n\tconsole.log(\"data\", data.json()); \n});" }
]
}
Выбрать несколько полей таблицы в JSON
SELECT a.id, a.name
, json_agg(json_build_object('col1', b.col1, 'col2', b.col2, 'col3', b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
Обновление записи из другой таблицы (подзапроса)
UPDATE client_diagnoses SET is_fixed = cure_result.is_fixed FROM cure_result WHERE client_diagnoses.client_diagnoses_id = cure_result.client_diagnoses_id