ruby-on-rails - Sqlite3 事件记录 :order => "time DESC" doesn't sort

标签 ruby-on-rails sqlite reserved-words

rails 2.3.4,sqlite3
我正在尝试这个

Production.find(:all, :conditions => ["time > ?", start_time.utc], :order => "time DESC", :limit => 100)


该条件完美运行,但我遇到了 :order => time DESC 的问题。
一个偶然的机会,我发现它在运行 PostgreSQL 的 Heroku(使用 heroku 控制台测试)上有效。但是,在本地,使用 sqlite3,新条目无论我设定什么时间,都会在旧的之后排序。像这样(输出已被手动剥离):第二个条目是新的:

Production id: 2053939460, time: "2010-04-24 23:00:04", created_at: "2010-04-24 23:00:05"

Production id: 2053939532, time: "2010-04-25 10:00:00", created_at: "2010-04-27 05:58:30"

Production id: 2053939461, time: "2010-04-25 00:00:04", created_at: "2010-04-25 00:00:04"

Production id: 2053939463, time: "2010-04-25 01:00:04", created_at: "2010-04-25 01:00:04"


似乎它按主键、id 排序,而不是按时间排序。请注意,查询在 heroku 上运行良好,返回正确排序的列表!我喜欢sqlite,它太KISS了,希望你能帮我...
有什么建议?

更新/解决:
time 是保留的 sqlite3 关键字(日期等也是)。这就是为什么:order => 'time DESC'适用于 PostgreSQL ( non-reserved keyword ),但不适用于 sqlite3。解决方案是避免将 sqlite3 关键字作为列名,如果您打算对它们进行排序。 重命名解决了这个问题。
我已经使用标准的 rails 模式 updated_at 和 created_at 进行了测试,它们完美地工作。
我在开发中还是更喜欢sqlite3,它的使用非常简单流畅,复制数据库并发送给你的合作伙伴。感谢@newtover!

最佳答案

使用不带引号的保留字通常是一个坏主意。 time是 SQLite 中的内置函数,请尝试使用以下内容,并最好首先消除歧义:

Production.find(:all,
                :conditions => ["`time` > ?", start_time.utc],
                :order => "`time` DESC",
                :limit => 100)

UPD :问题似乎已经出现在SO上:

Rails Active Record find(:all, :order => ) issue

关于ruby-on-rails - Sqlite3 事件记录 :order => "time DESC" doesn't sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719941/

相关文章:

mysql - 由于在 MySQL 中使用保留字作为表名或列名而导致的语法错误

ruby-on-rails - rspec 测试中预计会出现错误

sqlite - Haxe-Android目标中的SQLite崩溃

sql - 家谱的递归 CTE 不递归

SQL SELECT 多个 INNER JOIN

java - Kotlin 不识别 Java 保留关键字

css - 让 application.css 覆盖 Bootstrap

ruby-on-rails - 延迟工作只是不工作

ruby-on-rails - Rails 3.1 按特定顺序加载 css

objective-c - 调用 SQLite 方法时的 EXC_BAD_ACCESS