【问题标题】:How to make Ruby on Rails create SQLite database with foreign keys enabled?如何让 Ruby on Rails 创建启用外键的 SQLite 数据库?
【发布时间】:2015-05-30 15:23:40
【问题描述】:

我是 Ruby on Rails 的新手,我使用 SQLite3 作为我的示例项目的数据库。我正在尝试在两个模型之间创建普通的一对多关系(例如,每个产品都有一个所有者,每个所有者可以有多个产品)。这可以正常工作,并且可以正确创建数据库架构。但是,当我在数据库管理工具中打开 development.sqlite3(我使用免费的 SQLite Express Personal http://www.sqliteexpert.com/download.html)时,我看不到该数据库具有引用完整性。没有为 Product 表列出外键,即使它确实包含 owner_id 列。

我尝试通过添加选项键来更改 database.yml:

default: &default
adapter: sqlite3
pool: 5
timeout: 5000
options: "PRAGMA foreign_keys=ON"

然后重新创建数据库:

rake db:drop db:create db:migrate

这将重新创建数据库,但再次没有列出外键。

我做错了吗?有没有解决方案。 (PS。如果这很重要,我会在 Windows 8.1 上运行所有这些)

【问题讨论】:

    标签: ruby-on-rails ruby sqlite sqlite3-ruby


    【解决方案1】:

    默认情况下,Rails 不创建外键引用。 Rails 使用从模型中的associations 派生的信息自行管理外键

    Rails 4.2 supports add_foreign_keymigrations。但是你不能在 SQLite 中使用它,因为 SQLite 不支持 Rails 用来创建外键的特定 ALTER TABLE 语句。 SQLite 非常有limited support for ALTER TABLE

    其他种类的 ALTER TABLE 操作,如 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT 等被省略。

    此外,add_foreign_key 仅支持对单个列的外键引用。

    如果您想学习 Rails, 由 dbms 强制执行引用完整性,您需要 a) 切换到 PostgreSQL 或 MySQL 之类的东西,或者 b) 在迁移中执行原始 SQL。即使使用 PostgreSQL 这样的东西也会更容易,主要是因为它完全支持标准 ALTER TABLE 语句。

    如果我是你,我还不会担心 dbms 会强制执行外键。先等到您对 Rails 环境和 Rails 约定感到满意。


    The release notes for Rails 4.2 也或多或少说 add_foreign_key 还不能与 SQLite 一起使用。

    迁移 DSL 现在支持添加和删除外键。他们 也被转储到 schema.rb 中。这时候只有mysql,mysql2 和 postgresql 适配器支持外键。

    【讨论】:

      【解决方案2】:

      这是我尝试在 Rails 5.x 文档中清除这一点的尝试:

      https://github.com/rails/rails/pull/33563

      目前只有mysql、mysql2和postgresql适配器支持 外键。 sqlite3 的实现是部分的,为 new 创建键 表,但不适用于通过 ALTER TABLE 语句的现有表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多