Как создать гипертаблицу с TimescaleDB из таблицы с общим первичным ключом?

Вопрос в значительной степени говорит обо всем. Я пытаюсь создать гипертаблицу с TimescaleDB из таблицы с общим первичным ключом:

CREATE TABLE cars
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
    time_bought TIMESTAMP NOT NULL,
    brand VARCHAR(100),
);


ALTER TABLE cars ADD CONSTRAINT PK_id_time_bought PRIMARY KEY(id, time_bought);


SELECT create_hypertable('cars', 'time_bought');

Когда я пытаюсь запустить это с помощью Java через Intellij, я получаю эту ошибку:

SQL State  : 42883
Error Code : 0
Message    : ERROR: function create_hypertable(unknown, unknown) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
  Position: 8
Location   : db/migration/tenants/V1__init_schema.sql (C:\example\target\classes\db\migration\tenants\V1__init_schema.sql)
Line       : 45
Statement  : SELECT create_hypertable('cars', 'time_bought')

Обновление: я попытался запустить миграцию, не помещая в таблицу какие-либо первичные ключи, но по-прежнему выдает ту же ошибку. Может быть проблема в том, что Flyway вообще не поддерживает функции TimescaleDB? И если да, то как мне это обойти?


person Ben    schedule 26.05.2021    source источник
comment
Вероятно, проблема связана с тем, что функция не найдена. По крайней мере, я не вижу другой причины ошибки из приведенного выше кода. Вызовите \dx, чтобы узнать, установлен ли TimescaleDB в этой базе данных (он должен быть установлен в каждой базе данных). Вы в публичной схеме?   -  person k_rus    schedule 26.05.2021
comment
@k_rus Но когда я запускаю ту же функцию в графическом интерфейсе Postgres (PGadmin 4), она не выдает никаких ошибок. Я не в публичной схеме, я в схеме с именем schema_1.   -  person Ben    schedule 27.05.2021
comment
Попробуйте вызвать функцию с указанием схемы: SELECT public.create_hypertable(.... TimescaleDB по умолчанию создает функции в public, поэтому его не будет в вашей схеме.   -  person k_rus    schedule 27.05.2021
comment
@k_rus Проблема не в этом, потому что миграция выполняется в определенном контексте схемы. Но я нашел проблему. Когда я просматриваю «функции» в своей общедоступной схеме, есть много функций, включая create_hypertable (), однако в schema_1 каталог «functions» пуст. Итак, я думаю, мне нужно включить функцию в новые схемы, когда я как-то их создам.   -  person Ben    schedule 27.05.2021
comment
Вы имеете в виду, что в вашей среде не работает явное указание public имени схемы при вызове функции?   -  person k_rus    schedule 27.05.2021
comment
@k_rus Я могу это сделать, но разве функция не должна быть в конкретной схеме, которая должна ее запускать?   -  person Ben    schedule 27.05.2021
comment
@k_rus ну видимо нет, работает! Спасибо большое, моя проблема решена.   -  person Ben    schedule 27.05.2021
comment
Замечательно, что это исправлено. Я дам ответ позже, как бороться с такой ошибкой, основываясь на приведенном выше обсуждении.   -  person k_rus    schedule 27.05.2021


Ответы (1)


Согласно документации create_hypertable, обращение к нему кажется мне правильным. Так что вполне вероятно, что ни одна из функций TimescaleDB не может быть найдена. Распространенные причины:

  1. Расширение TimescaleDB не было создано в базе данных.
  2. Функции TimescaleDB находятся в другой схеме, чем текущая схема.

Расширение TimescaleDB создается для каждой базы данных. Таким образом, если он был создан в одной базе данных, он не будет доступен в другой базе данных. Если расширение было создано, можно проверить с помощью \dx. Например

\dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

create extension timescaledb;

\dx
                                       List of installed extensions
    Name     |  Version  |   Schema   |                            Description
-------------+-----------+------------+-------------------------------------------------------------------
 plpgsql     | 1.0       | pg_catalog | PL/pgSQL procedural language
 timescaledb | 2.3.0-dev | public     | Enables scalable inserts and complex queries for time-series data
(2 rows)

Обратите внимание, что расширение было создано в схеме public.

Таким образом, если сеанс не находится в той же схеме, например, public, функция не будет найдена. Текущую схему можно проверить с помощью SELECT current_schema;. Если это не та же схема, тогда в вызове функции следует указать имя схемы. Например:

SELECT current_schema;
 current_schema
----------------
 test_schema
(1 row)

SELECT create_hypertable('my_table', 'time_column');
ERROR:  function create_hypertable(unknown, unknown) does not exist
LINE 1: SELECT create_hypertable('my_table', 'time_column');
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

SELECT public.create_hypertable('my_table', 'time_column');
person k_rus    schedule 28.05.2021