gpt4 book ai didi

postgresql - 无法使用 DBIx::Class::Schema::Versioned 创建非虚拟 View

转载 作者:行者123 更新时间:2023-11-29 11:29:55 25 4
gpt4 key购买 nike

我正在使用 DBIx::Class::Schema::Versioned,我想创建一个新 View 作为数据库中的一个表。设置 __PACKAGE__->result_source_instance->is_virtual(1); 可以正确使用模式中的 View 定义(不创建表),但是当我设置 __PACKAGE__->result_source_instance->is_virtual (0); 没有在数据库中创建表,并且尝试获取结果集会引发“关系不存在”错误(这是预期的)。

我在文档中找不到任何关于如何在 DBIx::Class::Schema::Versioned 中创建 View 的引用。当我在不包含 View 的旧版本和新版本之间运行差异时,会发生什么情况,文件 sql/MyProject-Schema-38-PostgreSQL.sql 包含用于创建 View 的代码:

-- 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;

非常感谢任何帮助!

最佳答案

我不确定我是否理解这个问题,但这是我的看法。

创建 View 是针对特定查询完成的,硬编码SQL来实现你觉得DBIx::Class没有提供的东西,并使那些查询的结果对DBIx可用,并且能够使用通常的结果(集合)类。

它并不意味着对应于 postgres 中的 View 。就 DBIx 而言,“更新” View 意味着在您的 View 类中使用更新的 SQL - 无需将其存储在数据库中。

如果你在 postgres 中创建了一个你想使用的 View ,你可以,但我不认为 Schema::Version 与它有任何关系。毕竟,这只是存储查询的两种不同方式,不是吗?

如果你想对 View 进行版本控制,你可能需要寻找一个完全不同的途径,并使用像 sqitch 这样的东西来对你的 sql 文件进行版本控制,但是,您的模式文件无论如何都应该在版本控制系统中。

关于postgresql - 无法使用 DBIx::Class::Schema::Versioned 创建非虚拟 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48518070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com