我是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上运行所有这些)
答案 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
语句的现有表。