如何使Ruby on Rails创建启用了外键的SQLite数据库?

时间:2015-03-26 14:41:42

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

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

我尝试通过添加选项键来更改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上运行所有这些)

2 个答案:

答案 0 :(得分:7)

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

Rails 4.2 supports add_foreign_key中的

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

  

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

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

如果您想学习由dbms强制执行的引用完整性的Rails ,您需要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适配器支持外键。

答案 1 :(得分:0)

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

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

目前,仅mysql,mysql2和postgresql适配器支持 外键。 sqlite3的实现是局部的,为新的创建了密钥 表,但不适用于通过ALTER TABLE语句的现有表。