我正在使用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 ...
但是包含2版本之间差异的文件显示为空,因此在升级模式时,除了在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;
非常感谢任何帮助!
答案 0 :(得分:1)
我不确定我理解这个问题,但这是我的看法。
为特定查询创建视图,使用硬编码SQL来实现您认为DBIx :: Class不提供的内容,并使这些查询的结果可用于DBIx,并且能够使用通常的结果(set)类。
这并不意味着对应于postgres中的视图。 '更新'就DBIx而言,视图意味着在视图类中使用更新的SQL - 无需将其存储在数据库中。
如果你想在postgres中创建一个你想要使用的视图,你可以,但我不相信Schema :: Version与它有任何关系。毕竟,这些只是存储查询的两种不同方式,不是吗?
如果你想要版本视图,你可能需要查看一个完全不同的路由并使用像sqitch这样的东西来版本化你的sql文件, 但是,无论如何,您的模式文件应该在版本控制系统中。