- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 vanilla Rails 迁移将 daterange 类型的列更改为 tsrange(我意识到我需要时间和日期)
def self.up
change_column :events, :when, :tsrange
end
运行 rake db:migrate
后错误是
PG::DatatypeMismatch: ERROR: column "when"cannot be cast automatically to type tsrange
提示:指定一个 USING 表达式来执行转换。
: ALTER TABLE "events"ALTER COLUMN "when"TYPE tsrange
我尝试按照提示使用以下内容
def self.up
change_column :events, :when, :tsrange, 'tsrange USING CAST(when AS tsrange)'
end
然后得到了
没有将 Symbol 隐式转换为 Integer
据我所知,USING CAST 主要用于整数。假设我不想删除然后重新创建该列,您必须指定什么才能将类型从 daterange 更改为 tsrange?
我正在使用
一些背景、daterange 和 tsrange 在以下 PR 中被引入 Rails 4:https://github.com/rails/rails/pull/7345 .谢谢。
最佳答案
USING clause用于指定如何将旧值转换为新值:
The optional
USING
clause specifies how to compute the new column value from the old; if omitted, the default conversion is the same as an assignment cast from old data type to new. AUSING
clause must be provided if there is no implicit or assignment cast from old to new type.
所以只要没有从旧类型到新类型的默认转换,USING 就会出现。另请注意,USING 被指定为 USING expression
,因此任何表达式(其值属于正确类型)都可以与 USING 一起使用,最常见的是 USING CAST(...)
但 expression
几乎可以是任何东西。
希望这能消除一些关于 USING 的困惑。
那么ActiveRecord错误是怎么回事呢?嗯,change_column
期望在第四个参数中看到 options
散列,但您发送的是字符串。如果您查看 change_column
源代码,您会看到类似 options[:limit]
的内容,但是 String#[]
需要整数参数,所以你的字符串参数会触发关于符号的奇怪提示。
据我所知,没有办法让 AR 将 USING 子句添加到 change_column
生成的 ALTER TABLE ... ALTER COLUMN
中。如果您需要 USING 子句,这将留下 connection.execute(some_sql)
。当然,由于(明显)缺少从 daterange
到 tsrange
的内置转换,这变得更加复杂,但是如果你拉daterange
与 upper
and lower
分开功能:
connection.execute(%q{
alter table events
alter column "when"
type tsrange using tsrange(lower("when"), upper("when"))
})
您可以在此处看到表的变化:http://sqlfiddle.com/#!15/fb047/2
假设您使用默认的半开区间 ([...)
) 作为您的范围;如果您的范围不是在左侧关闭而在右侧打开,那么您将不得不使用 other range functions 构建更复杂的 USING 表达式。查看范围的左端和右端是开还是闭。
顺便说一句,when
是 PostgreSQL keyword所以它不是标识符的最佳选择,每次在 SQL 片段中引用该列时都必须说 "when"
,这可能会让人厌烦。我建议为该列使用不同的名称,这样您就不必担心引用问题。
关于postgresql - Rails 4,迁移以将列的数据类型从 daterange 更改为 tsrange,导致 PG::DatatypeMismatch:错误:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820997/
在编写接受来自用户的 tsrange 文字的程序的过程中,这些文字随后被插入到各种 SQL 查询中,今天我正在测试一些 tsrange 以查看 PostgreSQL 9.3.5 如何解释它们。 这一个
我有两个表free_time 和appointment。两者都包含 tsranges。 如何编写一个查询(或函数)来确定从 freetime 中“减去”appointment 的差值后的实际空闲时间?
我有两张 table 。 free_time 和 appointment。我想从空闲时间记录中减去所有约会记录。结果将是一组记录,其中还有空闲时间。约会保证存在于 free_time 范围内。我想进行
我有一个 events 表,其中有一个名为 duration 的字段,其类型为 tsrange,用于捕获事件的开始和结束时间这是timestamp类型。我想要的是能够过滤特定日期范围内的所有事件,然后
我想在 PostgreSQL 数据库的迁移中创建列 tsrange。有没有办法在 Laravel 迁移中做到这一点?如何指定这种列? 最佳答案 你可以使用这个库:https://github.com/
我想在 Postgresql TSRANGE 类型中插入一个无界范围,根据文档,您将无界边设置为空。所以我有 INSERT INTO MyTable(Id, DateRange) VALUES('8C
是否可以构建一个动态 tsrange 并检查值是否在其中? 我有一个包含两个字段的表,session_start 和 session_end,我想运行一个查询来检查传递的值是否介于这两个值之间。这些方
我正在尝试在 postgresql 查询中创建一个 tsrange(上周四到上周四),但出现转换错误。 这是我到目前为止所得到的(从 this SO question 开始)。 WITH past_w
我正在使用 DBD::Pg 尝试创建一个带有绑定(bind)变量的插入语句,其中一个是 tsrange。我不断收到语法错误,有人可以解释一下正确的方法吗? 来自 perl 脚本: $sth->{'in
我在 PostgreSQL 中保存 tsrange 类型的值时遇到问题,当时只有一个时间间隔是夏令时并且时间间隔小于 1 小时。 例如我想保存一个45分钟长的时间范围["2013-03-09 01:3
我有一个带有 tsrange column 的 Postgres 表,我想将其包含在我的 Ecto 模块的 schema 中。我看到了 Postgrex.Range exists .我试过这个: sc
我遵循了出色的指南 How to map Java and SQL arrays with JPA and Hibernate将特殊的 sql 类型 tsrange 映射到 hibernate 。我决
我正在为供应商提供的本地服务建模(在 Postgres 9.6.1/postGIS 2.3.1 中): create table supplier ( id se
我想在 sql 中建立一个本质上看起来像这样的索引: CREATE INDEX IF NOT EXISTS new_index ON schema.tablename USING gist (tsra
我正在尝试使用 vanilla Rails 迁移将 daterange 类型的列更改为 tsrange(我意识到我需要时间和日期) def self.up change_column :event
我是一名优秀的程序员,十分优秀!