我试图制作简单的SQL查询任务。所以我使用活动记录和SQLite为我的开发环境使用PostgreSQL作为我的产品。 ENV。
我认为使用ActiveRecord是因为它可以根据使用的DB生成查询,但我的所有查询都有一些PostgreSQL错误。
查询:
@sql[0] = Task.select(:done, :deadline).order(name: :asc).distinct
@sql[1] = Task.joins(:project).group(:project_id).select("projects.name,
COUNT(*) as TaskCount").order("TaskCount DESC")
@sql[2] = Task.joins(:project).group(:project_id).select("projects.name,
COUNT(*) as TaskCount").order("projects.name ASC")
@sql[3] = Task.select("projects.name AS pName","tasks.*")
.joins(:project).where("projects.name LIKE ?",'N%')
.where("projects.name LIKE ?","%_a_%")'
@sql[4] = Project.joins("LEFT OUTER JOIN tasks
ON 'projects'.'id'='tasks'.'project_id'")
.group(:project_id)
.select("projects.*, COUNT(tasks.project_id) as TaskCount")
.where("projects.name LIKE ?","%_a_%")
@sql[5] = Task.group(:name).having("COUNT(*)>1").order(name: :asc)
@sql[6] = Task.joins(:project).where("projects.name = 'Garage'")
.group("tasks.name, tasks.done, tasks.deadline")
.having("COUNT(*)>1").select("tasks.*, COUNT(*)").order("COUNT(*) DESC")
@sql[7] = Task.where("tasks.done = ?",true).joins(:project).group(:project_id)
.having("COUNT(*)>=10").select("projects.name, COUNT(*) as TaskCount")
.order("projects.id DESC")
他们每个人都有一些错误。
我不指望你解决这些问题。
答案 0 :(得分:5)
这可能值得一个恰当的答案。
我的问题如何首先避开它们?
首先要做的事情 - 保留rails guides for postgres方便的副本。这将涵盖大多数基地。你通常会在野外遇到它们 - 像these这样的例子比比皆是。所以在指出正确方向方面做得非常好。
我是否应该使用PostgreSQL进行开发?
绝对。 Heroku nails it on the head:
应用程序的开发与其在生产中的执行之间的任何差异都可能导致微小的不兼容性,导致在开发或暂存中工作的代码在生产中失败。 例如,避免在开发和生产之间使用不同的服务,即使适配器理论上抽象出服务中的任何差异。在本地使用SQLite和在生产中使用PostgreSQL;或者用于开发中的缓存和生产中的Memcached的本地进程内存,起初可能看起来无害,但可能是导致各种生产问题的原因。
更多阅读this SO post
哦,并且:
问:活动记录的目的是什么呢?我可以写纯粹的查询吗?因为它似乎是一个更好的选择。 (也许我错了?)
人们会在这个争论的both sides落后。有人说我们完全放弃ORM,因为它是antipattern。你会在这个问题的两边找到坚定的支持者。
我们所知道的是,它是一个有用的工具,应该使用有关SQL吐出的大量潜在知识。它当然很方便,但是如果你发现你正在执行不正常的查询或者某些东西没有按预期工作,那么请准备好卷起袖子 - 你总是可以在需要时写pure SQL。欢呼声。