我是Rails的新手,我在我的示例项目中使用SQLite3作为数据库。我试图在两种模式之间建立普通的一对多的关系。每个产品有一个所有者,每个所有者可以拥有许多产品)。这样做很好,并且正确地创建了数据库模式。但是,当我在数据库管理工具中打开development.sqlite3 (我使用免费的SQLite Express个人http://www.sqliteexpert.com/download.html)时,我不认为数据库具有引用完整性。产品表中没有列出外键,即使它包含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. )我正在Windows8.1上运行所有这些(如果这很重要的话)
发布于 2015-03-28 05:19:13
默认情况下,Rails不创建外键引用。Rails使用从模型中的联想派生的信息管理外键值本身。
钥匙 in 迁徙.但是您不能在SQLite中使用它,因为SQLite不支持Rails用于创建外键的特定ALTER语句。SQLite有非常对ALTER的有限支持。
省略了其他类型的ALTER操作,如DROP列、ALTER列、ADD约束等等。
此外,add_foreign_key只支持对单个列的外键引用。
如果您想学习由dbms强制执行的具有引用完整性的Rails,您需要:( a)切换到类似PostgreSQL或MySQL之类的东西,或者( b)在迁移中执行原始SQL。即使使用PostgreSQL这样的语句也会更容易,主要是因为它完全支持标准的ALTER语句。
如果我是你,我不会担心外键会被dbms强制执行。首先要等到您对Rails环境和Rails约定感到满意为止。
Rails 4.2的发行说明还或多或少地说,add_foreign_key还没有与SQLite一起工作。
迁移DSL现在支持添加和删除外键。他们也被甩给schema.rb了。此时,只有mysql、mysql2和postgresql适配器支持外键。
发布于 2018-08-09 09:19:18
下面是我在Rails 5.x文档中清除这些内容的尝试:
https://github.com/rails/rails/pull/33563
此时,只有mysql、mysql2和postgresql适配器支持外键。sqlite3的实现是部分的,键是为新表创建的,而不是通过ALTER TABLE语句为现有表创建的。
https://stackoverflow.com/questions/29281375
复制相似问题