Невозможно создать невиртуальное представление с помощью DBIx :: Class :: Schema :: Versioned

Я использую DBIx :: Class :: Schema :: Versioned и хочу создать новое представление в виде таблицы в базе данных. Установка __PACKAGE__->result_source_instance->is_virtual(1); позволяет правильно использовать определение представления из схемы (не создавая таблицу), но когда я устанавливаю __PACKAGE__->result_source_instance->is_virtual(0);, в базе данных не создается таблица, и при попытке получить набор результатов возникает ошибка «отношение не существует» (что ожидалось ).

Я не смог найти в документации никакой ссылки на то, как должны создаваться представления в DBIx :: Class :: Schema :: Versioned. Что происходит, когда я запускаю различие между старой версией, которая не содержит представления, и новой версией, файл sql/MyProject-Schema-38-PostgreSQL.sql содержит код для создания представления:

-- View: unlocked_pages
DROP VIEW unlocked_pages;
CREATE VIEW unlocked_pages ( page_id, username ) AS ...

но тогда файл, который содержит разницу между двумя версиями, кажется пустым, и поэтому при обновлении схемы ничего не делается, кроме добавления нового номера версии в dbix_class_schema_versions. Это содержимое sql / MyProject-Schema-37-38-PostgreSQL.sql:

-- Convert schema 'sql/MyProject-Schema-37-PostgreSQL.sql' to 'sql/MyProject-Schema-38-PostgreSQL.sql':;

-- No differences found;

Я использую postgresql, а определение в Schema.pm -

package MyProject::Schema;

# based on the DBIx::Class Schema base class
use base qw/DBIx::Class::Schema/;

use strict;
use warnings;

our $VERSION = 38;

# This will load any classes within
# MyProject::Schema::Result and MyProject::Schema::ResultSet (if any)
__PACKAGE__->load_namespaces();

__PACKAGE__->load_components(qw/Schema::Versioned/);

__PACKAGE__->upgrade_directory('../script/sql/');

1;

Любая помощь приветствуется!


person Bianca    schedule 30.01.2018    source источник


Ответы (1)


Я не уверен, что понимаю вопрос, но вот моя точка зрения.

Создание представления выполняется для конкретных запросов, жестко запрограммированного SQL для достижения того, что, по вашему мнению, DBIx :: Class не обеспечивает, и делает результаты этих запросов доступными для DBIx и позволяет использовать обычные классы результатов (наборов).

Он не предназначен для соответствия представлению в postgres. «Обновление» представления в отношении DBIx означает использование обновленного SQL в вашем классе представления - нет необходимости хранить его в базе данных.

Если вы создаете представление в postgres, которое хотите использовать, вы можете, но я не верю, что Schema :: Version имеет к этому какое-либо отношение. В конце концов, это просто два разных способа хранения запроса, не так ли?

Если вы хотите просматривать версии, вам, возможно, придется взглянуть на совершенно другой маршрут и использовать что-то вроде sqitch для версии ваших файлов sql, однако ваши файлы схемы в любом случае должны находиться в системе контроля версий.

person bytepusher    schedule 24.02.2018