@pgsql

Страница 941 из 1062
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 вроде уже не создаётся по умолчанию

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

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

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

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 - да. Должно сработать. Спасибо

Warstone
17.08.2018
11:01:53
что значит хранить как ввели?
Сохранить форматирование.

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

Yaroslav
17.08.2018
11:02:22
JSON не гарантирует порядок ключей. Какой уж тут UNIQUE
Разве? Кажется, JSON (не JSONB) действительно хранит "как ввели"... или я путаю?

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

а, нет

нельзя

Sergey
17.08.2018
11:03:19
Разве? Кажется, JSON (не JSONB) действительно хранит "как ввели"... или я путаю?
Если под json и jsonb понимать типы данных PostgreSQL то всё правильно

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
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
Какие бы опции не указывал, выходит эта ошибка
Да это просто на sequence(s) прав не хватает. А пробовали их исключить из дампа (кажется, -T или --exclude-table-data)? Не помню, работает ли это для sequences...

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;

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
Сам пользователь, а не дамп. Понимаешь?
ты думаешь, что я думаю, что командами CREATE USER создается дамп??

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
или это какая-то постгре магия?
нет, суперпользователь не нужен вам достаточно доступа на чтение для выполнения pg_dump

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
как именно ты собираешься дампить то, на что не имеешь права смотреть?
Ну нас же вроде не интересуют параметры sequence, нас интересуют данные из таблицы

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
Если ситуация такая же как вчера, то ему надо быстрее ?

Страница 941 из 1062