
Darafei
17.08.2018
08:50:23
А давайте про базы данных

Андрей
17.08.2018
08:50:33
сори

Anton
17.08.2018
09:59:15
Есть ли способ сделать так, чтобы последовательность записей при select была всегда одна и та же, если сортировка совпадает по всем полям? На ум приходит добавить сортировку по дате создания строки в таблице. Или можно как то зафиксировать план выполнения запроса?

crux
17.08.2018
10:04:52
добавить поле ID ?

Google

crux
17.08.2018
10:06:23
скрытый oid вроде уже не создаётся по умолчанию

Darafei
17.08.2018
10:07:49

Николай
17.08.2018
10:09:14
А причём тут план запроса?)

Anton
17.08.2018
10:11:21
При выполнении результат разный. Одинаковые по критериям строки местами случайным образом меняются

crux
17.08.2018
10:11:56
primary key есть в таблице?

Yaroslav
17.08.2018
10:14:28

Terminator
17.08.2018
10:51:54
@Warstone будет жить. Поприветствуем!
@d0as8 будет жить. Поприветствуем!

Warstone
17.08.2018
10:56:21
Здравствуйте, уважаемые. Вопрос такой возник:
Надо хранить JSON в базе, с сохранением форматирования "как ввели" (поле ввобще в админке - JSON), но нужно уметь unique на колонку именно как JSON, а не как текст. Вопрос:
JSON типа, хватит или лучше хранить как текст а в unique приводить к JSON'у (и можно-ли так делать)?

Eugeny
17.08.2018
10:58:40
что значит хранить как ввели?

Anton
17.08.2018
11:00:23
Материализованное

Google

Anton
17.08.2018
11:01:20
Primary key - да. Должно сработать. Спасибо

Sergey
17.08.2018
11:01:26

Warstone
17.08.2018
11:01:53

Eugeny
17.08.2018
11:02:15
ну тогде храни как текс, и делай unique индекс)

Yaroslav
17.08.2018
11:02:22

Warstone
17.08.2018
11:02:47

Eugeny
17.08.2018
11:02:49

crux
17.08.2018
11:02:55
можно хранить как текст, а уникальность по тексту с выпиленными пробелами.
а, нет
нельзя

Sergey
17.08.2018
11:03:19

crux
17.08.2018
11:05:49
{ a: 1, b:2 }
и
{ b: 2, a: 1 }
с точки зрения уникальности должны быть одинаковы, как я понимаю? Можно хранить как текст, а уникальность по какому-нибудь хешу отсортированных пар ключ-значение. Без собственного формирования ключа не обойтись имхо.

Yaroslav
17.08.2018
11:06:16
даже переносы строк?)
Ну да, похоже на то:
Because the json type stores an exact copy of the input text, it will preserve semantically-insignificant white space between tokens, as well as the order of keys within JSON objects. Also, if a JSON object within the value contains the same key more than once, all the key/value pairs are kept.
Я вообще почти не пользовался, но тот, кому нужно, может проверить.

Warstone
17.08.2018
11:06:24
Nfv vj;tn ,snm dkj;tyyst ckj;yst cnhernehs
=> CREATE TABLE test (id BIGSERIAL NOT NULL PRIMARY KEY, value TEXT);
CREATE TABLE
=> CREATE UNIQUE INDEX ON test ((value::jsonb));
CREATE INDEX
=> INSERT INTO test (value) VALUES ('{"key":"value"}');
INSERT 0 1
=> INSERT INTO test (value) VALUES ('{
'> "key": "value"
'> }');
ERROR: duplicate key value violates unique constraint "test_value_idx"
DETAIL: Key ((value::jsonb))=({"key": "value"}) already exists.
Вопрос производительности и скорости, конечно, но в данном случае это не так важно...

crux
17.08.2018
11:08:40
а с несколькими ключами в разном порядке это тоже работает?
и с вложенными массивами, например
не факт, что проверяются все уровни вложенности

Warstone
17.08.2018
11:13:56
Нормально там с вложенностью. Проверил. Но если значения в хешах различаются, то это не уникальные значения (что правильно, но может быть для некоторых - континтуитивно)
Вопрос оттуда-же...
=> INSERT INTO test (value) VALUES ('{"key":"value"}') ON CONFLICT DO NOTHING RETURNING id;
id
----
(0 rows)
INSERT 0 0
То есть если я конфликтнул, то такая запись уже есть, но я не получу ее id. Это описано в доке и т.д., но я хотел-бы получить id. Я могу обойти эту ситуацию так:
=> INSERT INTO test (value) VALUES ('{"key":"value"}') ON CONFLICT ((value::jsonb)) DO UPDATE SET value = test.value RETURNING id;
id
----
1
(1 row)
INSERT 0 1
Но это явный хак всего что можно... Есть какой-то нормальный вариант получить id конфликтующей записи?

Google

Yaroslav
17.08.2018
12:51:50

Andrey
17.08.2018
13:05:41
придумалось навскидку with a(id) as (insert into test(val) values('c') on conflict do nothing returning id) select coalesce((select id from a), (select id from test where val = 'c'));

Felix
17.08.2018
13:49:48
Кто может подсказать по pg_dump? Ситуация такая. Есть база, к ней ридонли доступ. Надо сдампить контент как INSERT statements. pg_dump выдает ошибку
pg_dump -h xxxxxxxxx.amazonaws.com -U xxxxx -W -d web --data-only --column-inserts -x -n public --table=core_additional_information >test.sql
Password:
pg_dump: [archiver (db)] query failed: ERROR: permission denied for relation core_additional_information_id_seq
pg_dump: [archiver (db)] query was: SELECT last_value, is_called FROM core_additional_information_id_seq
Какие бы опции не указывал, выходит эта ошибка

Yaroslav
17.08.2018
13:57:32

Felix
17.08.2018
13:58:06
щас попробую. прав для редактировать прав нету))

Zamira
17.08.2018
13:59:02
Вообще нужен ридонли суперюзер что бы бэкап снимать @FelixTheMagnificent

Felix
17.08.2018
13:59:43

Zamira
17.08.2018
14:00:24
CREATE USER felix SUPERUSER password 'backupuser';
ALTER USER felix set default_transaction_read_only = on;

Felix
17.08.2018
14:00:25

Zamira
17.08.2018
14:00:43
Вот так нужно создавать read only юзера что бы он мог бэкапы снимать

Felix
17.08.2018
14:01:15
мне не для бэкапов. а просто данные перенести
схема есть уже, таблицы тоже
только данные insert-ами

Zamira
17.08.2018
14:02:26
Повторяю еще раз. Что бы read only пользователь мог дампить базу, он должен быть создан той командой, что я написала выше
Сам пользователь, а не дамп. Понимаешь?

Felix
17.08.2018
14:04:13

Zamira
17.08.2018
14:04:47
Сдаюсь. Обясните кто нибудь другой

Felix
17.08.2018
14:05:19
я не понимаю, почему если я могу читать данные, почему я их не могу сдампить стандартной утилитой
только данные, без индексов, связей и т.д.

Google

Felix
17.08.2018
14:05:53
чтобы в итоге получилось куча инсертов

Zamira
17.08.2018
14:06:05
Феликс
Читай внимательно!
Нужно что бы у тебя был суперюзер для этого
Хоть и с read only правами
Но суперюзер
Понимаешь???

Felix
17.08.2018
14:06:49
не понимаю, зачем суперюзер для select *
или это какая-то постгре магия?

Sergey
17.08.2018
14:07:01

Zamira
17.08.2018
14:07:18
Вопрос был как это сделать или зачем мне суперюзер что бы это делать?

Felix
17.08.2018
14:07:51
вопрос был как имея текущие права на чтение, сдампить данные из конкретных таблиц базы

Tolya
17.08.2018
14:08:03

Dmitry
17.08.2018
14:08:05
ох лол
И как не лень, диву даёшься.

Felix
17.08.2018
14:09:18

Tolya
17.08.2018
14:09:52
потому что у вас нет доступа к этой последовательности
core_additional_information_id_seq

Felix
17.08.2018
14:10:38
Это я понял. А есть возможность сдампить, не имея доступа к последовательностям?

Darafei
17.08.2018
14:11:40
как именно ты собираешься дампить то, на что не имеешь права смотреть?

Google

Felix
17.08.2018
14:12:21

Sergey
17.08.2018
14:12:29

Felix
17.08.2018
14:13:16
просто как-то нелогично получается) в теории я могу написать скрипт, который делает select *, а потом построчно распихивает в sql insert данные
а pg_dump по сути то же самое сделать не может

Tolya
17.08.2018
14:16:11
а падает только при добавлении флага --column-inserts?

Sergey
17.08.2018
14:17:58
Нет

Felix
17.08.2018
14:18:43

Sergey
17.08.2018
14:19:20
postgres=# create table test_json (id bigserial, jtext json);
CREATE TABLE
postgres=# INSERT INTO test_json (jtext) VALUES ('{"key":"value","key2":"value2"}');
INSERT 0 1
postgres=# INSERT INTO test_json (jtext) VALUES ('{"key2":"value2", "key":"value " }');
INSERT 0 1
postgres=# create user reader password 'readpass';
CREATE ROLE
postgres=# grant select on test_json to reader;
GRANT
postgres=# \q
[nikor@hill ~]$ pg_dump -U reader -d postgres --data-only--table test_json
pg_dump: [archiver (db)] query failed: ERROR: permission denied for relation test_json_id_seq
pg_dump: [archiver (db)] query was: SELECT last_value, is_called FROM test_json_id_seq
[nikor@hill ~]$
Оно таки хочет узнать всё про sequence которое поддерживает bigserial.

Tolya
17.08.2018
14:21:01
ой, прикольно ?
я тоже все сломал )
update - нет, все стало нормально)

Zamira
17.08.2018
14:34:41
Конечно проще биться головой об закрытую дверь, чем просить пользователя с правильными правами.
ей богу быстрее было бы в sql клиент вытащить всю таблицу и экспортировать куда надо, если вот прям кроме голых данных одной таблицы больше ничего не нужно

Tolya
17.08.2018
14:35:07
ну тут не про быстрее же, а просто интересное поведение ?
понятно, что много решений можно придумать в обход

Zamira
17.08.2018
14:38:37
Если ситуация такая же как вчера, то ему надо быстрее ?