【问题标题】:Migration from SQLlite3 to PostgreSQL issue (Deployed to Heroku)从 SQLite3 迁移到 PostgreSQL 问题(部署到 Heroku)
【发布时间】:2012-05-25 14:35:21
【问题描述】:

自从我的开发环境默认设置为 sqllite3 以来,我在将 Rails 代码部署到 Heroku 时遇到了一些问题。这是以下日志快照:

ActiveRecord::StatementInvalid (PG::Error: ERROR:  syntax error at or near ":"
2012-05-25T14:11:55+00:00 app[web.1]: 
2012-05-25T14:11:55+00:00 app[web.1]: LINE 1: ...LECT "records".* FROM "records"  WHERE (TIMESTAMP(:order) >=...
2012-05-25T14:11:55+00:00 app[web.1]: : SELECT "records".* FROM "records"  WHERE (TIMESTAMP(:order) >= '2011-05-25 00:00:00' and TIMESTAMP(:order) <= '2012-05-25 23:59:59') ORDER BY created_at):
2012-05-25T14:11:55+00:00 app[web.1]:   app/controllers/records_controller.rb:20:in `index'

我的控制器文件中的代码片段:

opts = {:order => "created_at"}
opts[:conditions] = (@start_date.nil? ? "" : "TIMESTAMP(created_at::text) >= '#{@start_date.to_s(:db)}'")
opts[:conditions] += ((@start_date.nil? || @end_date.nil?) ? "" : " and ")
opts[:conditions] += (@end_date.nil? ? "" : "TIMESTAMP(created_at::text) <= '#{@end_date.to_s(:db)}'")

最初,我有一个“DATETIME”,你有 TIMESTAMP,所以我切换了它,但仍然遇到问题。此代码的上下文是我正在使用以下格式在日期之间运行查询:2011-05-25 00:00:00

【问题讨论】:

  • 我不太喜欢 Ruby,但看起来 :order 没有正确替换为 created_at,而是使用了符号本身。此外,写[...] WHERE created_at &lt;= '2011-05-25 00:00:00' [...] 就足够了

标签: sql ruby-on-rails postgresql heroku


【解决方案1】:

您的created_at 应该已经是timestamp,因此无需TIMESTAMP(created_at::text) 尝试将其转换为timestamptimestamp(x) 无论如何都不会在 PostgreSQL 中工作。对于 SQLite,您也不应该需要那种东西。

你最终会像这样运行 SQL:

SELECT "records".*
FROM "records"
WHERE TIMESTAMP(:order) >= '2011-05-25 00:00:00'
  and TIMESTAMP(:order) <= '2012-05-25 23:59:59'
ORDER BY created_at

您正在某处将 SQL 中的 created_at::text 更改为 :order。我无法重现该行为,但我怀疑您与命名占位符(即column = :value 而不是column = ?)发生冲突,但这只是一个疯狂的猜测。

无论如何,如果摆脱 timestamp(...) 的东西并切换到链接你的 where 调用,你会得到更好的东西:

query = Record.order(:created_at)
query = query.where('created_at >= ?', @start_date) if(@start_date.present?)
query = query.where('created_at <= ?', @end_date)   if(@end_date.present?)

然后您可以通过query.allquery.paginate(...) 或其他任何方式获得最终结果。这(恕我直言)比一堆字符串争吵要漂亮得多,它应该在任何地方都一样。

如果您要在 PostgreSQL(即 Heroku)上进行部署,那么您应该在 PostgreSQL 上进行开发和测试。 SQLite 对 SQL 是什么以及它的类型系统如何工作有一些奇怪的想法,PostgreSQL(谢天谢地)不那么宽容。您应该始终在同一个堆栈上开发和部署,并且相同一直适用于版本号。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2013-02-19
    • 2011-10-07
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多