如何使 Ruby on Rails 创建启用外键的 SQLite 数据库?
How to make Ruby on Rails create SQLite database with foreign keys enabled?
我是 Rails 上 Ruby 的新手,我使用 SQLite3 作为示例项目的数据库。我正在尝试在两个模型之间创建普通的一对多关系(例如,每个产品有一个所有者,每个所有者可以有多个产品)。这工作正常并且数据库模式已正确创建。但是,当我在数据库管理工具(我使用免费的 SQLite Express Personal http://www.sqliteexpert.com/download.html)中打开 development.sqlite3 时,我没有看到数据库具有参照完整性。 Product table 没有列出外键,即使它确实包含 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 上)
默认情况下,Rails 不创建外键引用。 Rails 管理外键 值 本身,使用它从模型中的 associations 派生的信息。
Rails 4.2 supports add_foreign_key in migrations. But you can't use that with SQLite, because SQLite doesn't support the specific ALTER TABLE statements that Rails uses to create foreign keys. SQLite has very limited support for ALTER TABLE。
Other kinds of ALTER TABLE operations such as DROP COLUMN, ALTER
COLUMN, ADD CONSTRAINT, and so forth are omitted.
此外,add_foreign_key 仅支持对单个列的外键引用。
如果你想学习 Rails with 由 dbms 强制执行的引用完整性,你需要 a) 切换到类似 PostgreSQL 或 MySQL,或 b) 在迁移中执行原始 SQL。使用像 PostgreSQL 这样的东西甚至会更容易,主要是因为它完全支持标准的 ALTER TABLE 语句。
如果我是你,我不会担心 dbms 强制执行外键。等到您对 Rails 环境和 Rails 约定感到满意为止。
The release notes for Rails 4.2 也或多或少地说,add_foreign_key 还不适用于 SQLite。
The migration DSL now supports adding and removing foreign keys. They
are dumped to schema.rb as well. At this time, only the mysql, mysql2
and postgresql adapters support foreign keys.
这是我在 Rails 5.x 文档中尝试清除此内容的尝试:
https://github.com/rails/rails/pull/33563
目前只有mysql、mysql2和postgresql适配器支持
外键。 sqlite3 的实现是部分的,键是为新创建的
表,但不适用于通过 ALTER TABLE
语句的现有表。
我是 Rails 上 Ruby 的新手,我使用 SQLite3 作为示例项目的数据库。我正在尝试在两个模型之间创建普通的一对多关系(例如,每个产品有一个所有者,每个所有者可以有多个产品)。这工作正常并且数据库模式已正确创建。但是,当我在数据库管理工具(我使用免费的 SQLite Express Personal http://www.sqliteexpert.com/download.html)中打开 development.sqlite3 时,我没有看到数据库具有参照完整性。 Product table 没有列出外键,即使它确实包含 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 上)
默认情况下,Rails 不创建外键引用。 Rails 管理外键 值 本身,使用它从模型中的 associations 派生的信息。
Rails 4.2 supports add_foreign_key in migrations. But you can't use that with SQLite, because SQLite doesn't support the specific ALTER TABLE statements that Rails uses to create foreign keys. SQLite has very limited support for ALTER TABLE。
Other kinds of ALTER TABLE operations such as DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT, and so forth are omitted.
此外,add_foreign_key 仅支持对单个列的外键引用。
如果你想学习 Rails with 由 dbms 强制执行的引用完整性,你需要 a) 切换到类似 PostgreSQL 或 MySQL,或 b) 在迁移中执行原始 SQL。使用像 PostgreSQL 这样的东西甚至会更容易,主要是因为它完全支持标准的 ALTER TABLE 语句。
如果我是你,我不会担心 dbms 强制执行外键。等到您对 Rails 环境和 Rails 约定感到满意为止。
The release notes for Rails 4.2 也或多或少地说,add_foreign_key 还不适用于 SQLite。
The migration DSL now supports adding and removing foreign keys. They are dumped to schema.rb as well. At this time, only the mysql, mysql2 and postgresql adapters support foreign keys.
这是我在 Rails 5.x 文档中尝试清除此内容的尝试:
https://github.com/rails/rails/pull/33563
目前只有mysql、mysql2和postgresql适配器支持
外键。 sqlite3 的实现是部分的,键是为新创建的
表,但不适用于通过 ALTER TABLE
语句的现有表。