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

5
我是Ruby on Rails的新手,我的样本项目使用SQLite3作为数据库。我正在尝试在两个模型之间创建普通的一对多关系(例如,每个产品都有一个所有者,每个所有者可以拥有多个产品)。这很好用,数据库架构已经正确创建。然而,当我在数据库管理工具中打开development.sqlite3(我使用免费的SQLite Express Personal http://www.sqliteexpert.com/download.html),我没有看到数据库具有引用完整性。虽然它包含owner_id列,但Product表中没有列出外键。我尝试通过添加options键来更改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个回答

7
默认情况下,Rails不会创建外键引用。Rails使用从模型的关联中获取的信息自己管理外键Rails 4.2支持在迁移中添加外键引用。但是你不能在SQLite中使用它,因为SQLite不支持Rails用于创建外键的特定ALTER TABLE语句。SQLite对ALTER TABLE的支持非常有限

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

此外,add_foreign_key仅支持对单个列的外键引用。
如果您想在dbms执行引用完整性的情况下学习Rails,您需要选择像PostgreSQL或MySQL这样的其他选项,或在迁移中执行原始SQL。即使使用PostgreSQL,这也会更容易,主要是因为它完全支持标准的ALTER TABLE语句。
如果我是您,我不会过早担心由dbms强制执行外键。先等到您熟悉Rails环境和Rails约定后再考虑。

Rails 4.2发布说明也表示,add_foreign_key与SQLite还不兼容。

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


0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接