我正在将使用sqlite3开发的Ruby on Rails应用程序部署到具有MySQL或Postgresql的服务器.我很快发现,我正在大量使用“group by”和“strftime”函数来生成按月汇总报告,这些函数在各种数据库之间的工作方式不同或不兼容.
我可以重构我的代码来进行分组,求和和平均 – 但数据库做得很好,减少了服务器所需的处理!高级应用程序超越了简单的选择和加入. ActiveRecord给我们:group,但DATABASES并不一致.
所以我的问题是架构问题 – 有人希望在Ruby on Rails中创建真正的“数据库可移植”应用程序吗?我应该修改我的代码库以仅使用MysqL而忘记其他数据库吗?我应该修改我的代码库来进行高级分组,求和和平均吗?
欢呼 – 唐
解决方法:
几条评论:
>使用您要部署的相同RDBMS品牌和版本进行开发和测试.
>编写可移植的sql代码很难,因为供应商拥有所有这些非标准的额外功能和特性.例如,strftime()不是ANSI sql标准的一部分.解决此问题的唯一方法是为您使用的每个数据库使用RTM,并了解它们共有的功能.有时它们具有不同名称的功能,您可以以类似的方式使用它们.这方面没有捷径 – 你必须学习手册.
>所有数据库都支持GROUP BY,但sqlite和MysqL对某些用法比标准ANSI sql(以及遵循该标准的所有其他品牌数据库)更宽松.具体来说,在GROUP BY子句中,必须将选择列表中不属于分组函数的每一列命名.
以下两个例子是正确的:
@H_502_22@SELECT A, B, COUNT(C) FROM MyTable GROUP BY A, B; SELECT A, COUNT(C) FROM MyTable GROUP BY A;
但是下一个是错误的,因为B每个组有多个值,并且它应该在给定行中返回哪个值是不明确的:
@H_502_22@SELECT A, B, COUNT(C) FROM MyTable GROUP BY A;
>没有框架可以写真正的可移植sql. Rails的ActiveRecord仅在非常简单的情况下解决了这个问题.实际上,ActiveRecord有助于解决您提供的示例,品牌特定的功能和非标准的GROUP BY子句.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。