ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 数据库SQL兼容性

2019-07-30 11:13:54  阅读:268  来源: 互联网

标签:ruby-on-rails mysql postgresql database sqlite3


我正在将使用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子句中,必须将选择列表中不属于分组函数的每一列命名.

以下两个例子是正确的:

SELECT A, B, COUNT(C) FROM MyTable GROUP BY A, B;
SELECT A, COUNT(C) FROM MyTable GROUP BY A;

但是下一个是错误的,因为B每个组有多个值,并且它应该在给定行中返回哪个值是不明确的:

SELECT A, B, COUNT(C) FROM MyTable GROUP BY A;

>没有框架可以写真正的可移植SQL. Rails的ActiveRecord仅在非常简单的情况下解决了这个问题.实际上,ActiveRecord有助于解决您提供的示例,品牌特定的功能和非标准的GROUP BY子句.

标签:ruby-on-rails,mysql,postgresql,database,sqlite3
来源: https://codeday.me/bug/20190730/1581660.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有