默认自动选择隐藏的ROWID列

Posted

技术标签:

【中文标题】默认自动选择隐藏的ROWID列【英文标题】:Automatically select hidden ROWID Column by default 【发布时间】:2021-05-27 11:16:08 【问题描述】:

首先,为现有应用程序设置数据库。它在 Advantage 数据库服务器上,我无法更改表结构。

某些表的“主键”设置为伪列ROWID,它始终存在于所有表中,但默认情况下从不选择。

我已经说服适配器让它总是在columns 中宣布ROWID 的存在,这样我现在就可以愉快地运行annotaterake db:schema:dump,但它仍然会导致问题对于我的模型,ROWID 不包含在标准选择的select * 中:

Worksheet.last
 => #<Worksheet ROWID: nil, FILENAME: "2130002", CREATED: "2021-03-04", ANALYST: "CJH", WKSTATUS: "PURGED", DETS: "02535", FIRSTSAMP: 0.106499e6, CHECKDATE: nil, CHECKTIME: "", CHECKEDBY: "", EXCEL: false>

Worksheet.last.ROWID
 => nil

Worksheet.select("ROWID, WKSHEET.*").last
 => #<Worksheet ROWID: "CFTquNBaHrvwAAAAAF", FILENAME: "2130002", CREATED: "2021-03-04", ANALYST: "CJH", WKSTATUS: "PURGED", DETS: "02535", FIRSTSAMP: 0.106499e6, CHECKDATE: nil, CHECKTIME: "", CHECKEDBY: "", EXCEL: false>

Worksheet.select("ROWID, WKSHEET.*").last.ROWID
 => "CFTquNBaHrvwAAAAAF"

有没有办法设置“默认范围”或类似的方法,以便表自动包含ROWID 列(至少在使用它作为“主键”的特定表上)? ...最好不使用表名,因为这并不总是合乎逻辑的

为了完整性而缩减模型:

class Worksheet < ApplicationRecord
  self.table_name = 'WKSHEET'
  self.sequence_name = :autogenerated
  self.primary_key = 'ROWID'
end

对于喜欢轻松阅读数据库内部结构的任何人,this link 解释了 ADS ROWID 伪列

【问题讨论】:

【参考方案1】:

这真的很简单,只需使用 select 添加 default_scope:

class Worksheet < ApplicationRecord
  self.table_name = 'WKSHEET'
  self.sequence_name = :autogenerated
  self.primary_key = 'ROWID'

  default_scope  select("#table_name.ROWID, #table_name.*") 
end

输出:

Worksheet.last
 => #<Worksheet ROWID: "CFTquNBaHrvwAAAAAF", FILENAME: "2130002", CREATED: "2021-03-04", ANALYST: "CJH", WKSTATUS: "PURGED", DETS: "02535", FIRSTSAMP: 0.106499e6, CHECKDATE: nil, CHECKTIME: "", CHECKEDBY: "", EXCEL: false>

Worksheet.last.ROWID
 => "CFTquNBaHrvwAAAAAF"

更好的是,通过使用 #table_name,我可以将该行复制并粘贴到所有使用 ROWID 作为主键的模型中。

【讨论】:

以上是关于默认自动选择隐藏的ROWID列的主要内容,如果未能解决你的问题,请参考以下文章

在 kendo-ui 网格中显示/隐藏列后,有啥方法可以自动调整网格列宽?

winform中DataGridView 列隐藏时会触发啥事件?

informix/oracle rowid 问题

二十mysql索引管理详解

如何使用自动生成的列隐藏 ASP.NET GridView 中的列?

方镁石。插入后如何获取自动增量主键的值,除了last_insert_rowid()?