Как обновить PostgreSQL до IDENTITY (или альтернативы)? - PullRequest
0 голосов
/ 02 августа 2020

NB: извините за длинный пост.

Я размещаю PeerTube экземпляр на OpenBSD 6.7 с PostgreSQL 12.3.

У меня регулярно возникают проблемы с базой данных , потому что, я не знаю, почему, СЕРИЙНАЯ вещь в Id вызывает проблемы:

error[13/07/2020 à 23:01:04] Cannot create video views for video 1004826 in hour 22.
 
{
  "err": {
    "stack": "SequelizeDatabaseError: null value in column \"id\" violates not-null constraint\n    at Query.formatError (/var/www/peertube/versions/peertube-v2.3.0-rc.1/node_modules/sequelize/lib/dialects/postgres/query.js:366:16)\n
...
    "message": "null value in column \"id\" violates not-null constraint",

Здесь мы видим, что вещь должна передать DEFAULT в Id COLUMN.

"sql": "INSERT INTO \"video\" (\"id\",\"uuid\",\"name\",\"category\",\"licence\",\"language\",\"privacy\",\"nsfw\",\"description\",\"support\",\"duration\",\"views\",\"likes\",\"dislikes\",\"remote\",\"url\",\"commentsEnabled\",\"downloadEnabled\",\"waitTranscoding\",\"state\",\"publishedAt\",\"originallyPublishedAt\",\"channelId\",\"createdAt\",\"updatedAt\") VALUES (DEFAULT,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24) RETURNING *;",

Итак, после небольшого исследования я нашел около столбец IDENTITY и приступил к изменению некоторых из них, просто чтобы посмотреть, улучшит ли это ситуацию.

Итак, я изменил столбец Id для IDENTITY. Но теперь я забыл отбросить ПОСЛЕДОВАТЕЛЬНОСТЬ (ту, которая была там в первую очередь, чтобы все работало ...) в первую очередь. Попробуем:

peertube_prod2=> DROP SEQUENCE "videoView_id_seq";
ERROR:  cannot drop sequence "videoView_id_seq" because column id of table "videoView" requires it
HINT:  You can drop column id of table "videoView" instead.

Но я не могу удалить столбец id. Поэтому вместо этого я скопировал содержимое столбца id в другой. Затем удалил исходный столбец id и заменил его столбцом Identity (я в основном сделал операцию обмена с временным столбцом и вернулся к исходному имени). Но я все еще не могу отбросить эту чертову ПОСЛЕДОВАТЕЛЬНОСТЬ.

Та же самая операция не может произойти ни на какой-то ключевой ТАБЛИЦЕ (со ссылками на половину остальной БД).

Итак, на самом деле проблема переместилась . Я все еще не могу обновить эту вещь (потому что SEQUENCE все еще там, даже если Id теперь является полем IDENTITY):

warn[02/08/2020 à 11:02:26] Cannot process activity Update.

{
  "err": {
    "stack": "SequelizeDatabaseError: more than one owned sequence found\n    at Query.formatError (/var/www/peertube/versions/peertube-v2.3.0/node_modules/sequelize/lib/dialects/postgres/query.js:366:16)\n
...
    "message": "more than one owned sequence found",

Структура таблицы после обновления до IDENTITY:

peertube_prod2=> \d "videoView"
                                    Table "public.videoView"
  Column   |           Type           | Collation | Nullable |             Default
-----------+--------------------------+-----------+----------+----------------------------------
 startDate | timestamp with time zone |           | not null |
 endDate   | timestamp with time zone |           | not null |
 views     | integer                  |           | not null |
 videoId   | integer                  |           | not null |
 createdAt | timestamp with time zone |           | not null |
 col       | integer                  |           |          |
 id        | integer                  |           | not null | generated by default as identity
Indexes:
    "video_view_start_date" btree ("startDate")
    "video_view_video_id" btree ("videoId")
Foreign-key constraints:
    "videoView_videoId_fkey" FOREIGN KEY ("videoId") REFERENCES video(id) ON UPDATE CASCADE ON DELETE CASCADE

структура таблицы с самого начала:

peertube_prod2=> \d "videoComment"
                                            Table "public.videoComment"
       Column       |           Type           | Collation | Nullable |                  Default
--------------------+--------------------------+-----------+----------+--------------------------------------------
 id                 | integer                  |           | not null | nextval('"videoComment_id_seq"'::regclass)
 url                | character varying(2000)  |           | not null |
 text               | text                     |           | not null |
 originCommentId    | integer                  |           |          |
 inReplyToCommentId | integer                  |           |          |
 videoId            | integer                  |           | not null |
 accountId          | integer                  |           |          |
 createdAt          | timestamp with time zone |           | not null |
 updatedAt          | timestamp with time zone |           | not null |
 deletedAt          | timestamp with time zone |           |          |
Indexes:
    "videoComment_pkey" PRIMARY KEY, btree (id)
    "video_comment_url" UNIQUE, btree (url)
    "video_comment_account_id" btree ("accountId")
    "video_comment_created_at" btree ("createdAt" DESC)
    "video_comment_video_id" btree ("videoId")
    "video_comment_video_id_origin_comment_id" btree ("videoId", "originCommentId")
Foreign-key constraints:
    "videoComment_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES account(id) ON UPDATE CASCADE ON DELETE CASCADE
    "videoComment_inReplyToCommentId_fkey" FOREIGN KEY ("inReplyToCommentId") REFERENCES "videoComment"(id) ON UPDATE CASCADE ON DELETE CASCADE
    "videoComment_originCommentId_fkey" FOREIGN KEY ("originCommentId") REFERENCES "videoComment"(id) ON UPDATE CASCADE ON DELETE CASCADE
    "videoComment_videoId_fkey" FOREIGN KEY ("videoId") REFERENCES video(id) ON UPDATE CASCADE ON DELETE CASCADE
Referenced by:
    TABLE ""userNotification"" CONSTRAINT "userNotification_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "videoComment"(id) ON UPDATE CASCADE ON DELETE CASCADE
    TABLE ""videoComment"" CONSTRAINT "videoComment_inReplyToCommentId_fkey" FOREIGN KEY ("inReplyToCommentId") REFERENCES "videoComment"(id) ON UPDATE CASCADE ON DELETE CASCADE
    TABLE ""videoComment"" CONSTRAINT "videoComment_originCommentId_fkey" FOREIGN KEY ("originCommentId") REFERENCES "videoComment"(id) ON UPDATE CASCADE ON DELETE CASCADE

Хотя я мог бы снова создать пустую базу данных с столбцами IDENTITY повсюду, а затем импортировать данные из текущей базы данных. Можно ли это сделать?

Или я могу обновить текущую базу данных напрямую?

Или ... что я пропустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...