我是数据库和Ruby on rails应用程序的新手。
我有一个关于从ORM生成查询的问题。
当我的数据库是SQLite,并且我使用代码为这个数据库创建查询时,如果我更改了我的数据库,我仍然可以使用相同的代码吗?
另外,当我使用Arel时,因为它为更复杂的查询提供了更多准备好的方法,所以在我生成查询之前,我调用了方法.to_sql 如果我想使用相同的代码但是对于另一个数据库,我还能执行查询吗?用而不是to_sql吗?
答案 0 :(得分:0)
通常,Ruby on Rails代码可以在数据库之间移植,除了调整config / database.yml文件(用于连接详细信息)和更新Gemfile(使用正确的数据库适配器gem)之外。
当您不依赖于SQL的特定硬编码使用作为调用查询的方式时,数据库可移植性很可能。而是使用Rails'尽可能使用关联,关系和查询工具。特定的SQL通常会出现在.where()子句中,所以要考虑周到并尽可能地减少/简单实际(例如,可以链接的多个简单范围可能比尝试更大更复杂的单个范围更好)。在依赖" LIKE"时也使用Arel.matches。在.where()调用中键入子句而不是硬编码LIKE细节,因为不同的数据库(如PostgreSQL)处理区分大小写的方式不同。
在切换数据库时,对防止意外的最佳防御是一组强大的自动化单元(例如,Rspec,minitest)和集成测试(例如,capybera)。在您无法避免使用特定SQL编码(例如优化或奇/复查询)时,这些特别重要。
由于SQLite比大多数其他强大的引擎(如MySQL或Postgres)更简单,因此无论如何,在您依赖的任何操作中,您都可能更安全。在使用数据库的某些高级或特定功能时,您最容易受到攻击,但如果您正在执行此操作,您通常也会更加清楚,因此可以编写保护性测试以帮助警告您切换数据库引擎