【问题标题】:Rails compare Time.current to database entry, Postgres vs. MySQLRails 将 Time.current 与数据库条目、Postgres 与 MySQL 进行比较
【发布时间】:2015-11-11 16:42:32
【问题描述】:

我对使用 Rails 的 PostgreSQL 有疑问。我有一张日期时间“从”和“到”的表。在我的控制器中,我得到了以下信息:

@running = Model.where("'to' > ?", Time.now)
@finished = Model.where("'to' < ?", Time.now)

我已经知道我必须转义“to”,因为它是一条 SQL 语句。现在的问题是,使用 MySQL 和 SQLite,我可以使用 ` 对其进行转义,因此在我的开发环境 (sqlite) 中,它可以使用:

.where("`to` > ?", Time.now) 

它实际上在应用程序中工作正常。

但是我的生产环境是 Postgres,而 Postgres 不支持 ``,并且 '' 显然不起作用,因为“to”条目是什么并不重要,它总是显示 @running 一个,即使应该是@finished。

怎么了?

谢谢!!

【问题讨论】:

  • 您是否尝试使用 table_name:Model.where("table_name.to &gt; ?", Time.now)
  • 如果我是你,我只会更改列名并省去很多麻烦。
  • 首先,有什么东西会比Time.now 更大?其次,为什么不使用Model.where(to: Time.now..5.years.ago) 或您实际尝试展示的任何范围?

标签: ruby-on-rails ruby database postgresql rails-activerecord


【解决方案1】:

这是 SQL 中的字符串文字:

'to'

这是(标准)SQL 中的带引号的标识符:

"to"

这是 MySQL 中带引号的标识符:

`to`

出于兼容性原因,SQLite 还支持 MySQL 特定的语法。为了完整起见,这是 SQL Server 中的一个带引号的标识符:

[to]

PostgreSQL 遵循标准。

所以当你这样说时:

Model.where("'to' > ?", Time.now)

您正在尝试将常量字符串与格式化为字符串的时间戳进行比较。在 Ruby 中应该是这样的:

'to' > '2015-11-11 09:27:11'

所以它当然不能按预期工作。

您有多种选择:

  1. 重命名该列,这样您就不必担心引用它。
  2. 在您的开发、测试和生产环境中使用相同的数据库,这样您就不必担心标识符引用的差异。无论如何,这是一个非常好的主意,ActiveRecord 无法帮助您解决数据库之间的许多差异。
  3. 尝试让 ActiveRecord 为您编写 SQL。这对于非= 比较来说效果不佳,除非您想用 AREL 搞得一团糟。

我将从 2 开始,因为正如我所说,数据库之间存在许多差异(标识符引用、保留字、区分大小写、日期/时间操作函数、SQL 功能、列类型、GROUP通过行为,...)ActiveRecord 无法帮助您。在一个数据库上开发和测试,但在另一个数据库上部署只是自找麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多