4

PostgreSQL 12 有一个很酷的Generated Columns功能,但我无法在 Rails 中检查列是否是虚拟的。

作为参考,Rails 中的 MySQL 适配器允许您这样做

MyModel.supports_virtual_columns?
=> true
MyModel.columns.last.virtual?
=> false

但是在 PostgreSQL 适配器中你不能做同样的事情,尽管它确实支持生成的字段?

导轨 v.5.1.7

4

2 回答 2

1

PostgreSQL 12 实现生成列的事实并不意味着您将通过 Rails PostgreSQLAdapter 的接口来检查列是否是虚拟的,因为它还没有实现(还没有实现)。

如果您在ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter代码中看到supports_virtual_columns?非常简单:

def supports_virtual_columns?
  mariadb? || database_version >= "5.7.5"
end

而检查列是否为虚拟的代码如下所示:

def virtual?
  /\b(?:VIRTUAL|STORED|PERSISTENT)\b/.match?(extra)
end

它检查是否从 a 返回的 Extra 值

SHOW FULL FIELDS FROM table_name;

该列的查询与 VIRTUAL、STORED 或 PERSISTENT 匹配,如果匹配,则返回 true。

但这在 PostgreSQL 对应物中不存在。supports_virtual_columns?将在任何未开发此功能的适配器中返回 false,因为它在ActiveRecord::ConnectionAdapters::AbstractAdapter返回 false 中定义:

# Does this adapter support virtual columns?
def supports_virtual_columns?
  false
end
于 2020-01-26T16:04:16.420 回答
1

从 rails 7开始为 postgresql 添加了该功能

所以你可以MyModel.columns.last.virtual?在使用 mysql 时这样做

于 2022-01-25T09:40:36.213 回答