【问题标题】:Arel in SQLite and other databasesArel 在 SQLite 和其他数据库中
【发布时间】:2015-09-25 01:12:30
【问题描述】:

我是数据库和 Ruby on rails 应用程序的新手。

我有一个关于从 ORM 生成查询的问题。

如果我的数据库是 SQLite,并且我正在使用代码为该数据库创建查询,如果我更改了我的数据库,我仍然可以使用相同的代码吗?

另外,当我使用 Arel 时,因为它为更复杂的查询提供了更多现成的方法,所以在生成查询之前我调用方法 .to_sql 如果我想使用相同的代码,但对于另一个数据库,我仍然能够执行查询吗?用其他东西代替 to_sql?

【问题讨论】:

    标签: mysql sql ruby-on-rails ruby sqlite


    【解决方案1】:

    一般来说,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)更简单,因此在您依赖的任何操作中都可能更安全。在使用数据库的某些高级或特定功能时,您最容易受到攻击,但如果您这样做,您通常也会更清楚,因此可以编写保护性测试来帮助您在切换数据库引擎时发出警告。

    【讨论】:

    • 另外一个相对的问题是:如果你使用的是关系型数据库,那么你的代码变化不会那么多,而是变成一个键值数据库,比如 Mongo DB,那么有一个有很多变化吗?
    • 是的,Rails 的 ActiveRecord 是基于 SQL 关系数据库的。您可能需要将 ActiveModel 与 Mongoid 或 MongoMapper 一起使用才能正确使用 MongoDB。但是,当您考虑它时,这意味着您作为对象模型的模型架构通常是不同的,而不仅仅是因为数据库机制,因此无论如何重新审视您的设计是合适的(ORM = 对象关系映射,暗示关系数据库) .
    • 是的,这也是我的想法。非常感谢您的意见! :)
    • 你打赌,很高兴能帮上忙。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2011-03-21
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多