你能帮我解决这个问题。首先,我创建一个生成三个表的迁移。然后我尝试执行sql查询但由于某种原因触发了错误 我是新手。我正在阅读第四版的Rails指南(4.0.6 Ruby On Rails)
class ExampleMigration < ActiveRecord::Migration
def up
create_table :categories do |t|
end
create_table :users do |t|
t.string :email
end
create_table :products do |t|
t.references :category
end
execute <<-SQL
ALTER TABLE products
ADD CONSTRAINT fk_products_categories
FOREIGN KEY (category_id)
REFERENCES categories(id)
SQL
add_column :users, :home_page_url, :string
rename_column :users, :email, :email_address
end
def down
# add a foreign key
execute <<-SQL
ALTER TABLE products
DROP FOREIGN KEY fk_products_categories
SQL
rename_column :users, :email_address, :email
remove_column :users, :home_page_url
drop_table :products
drop_table :users
drop_table :products
end
Ubuntu控制台
trabajo@fernando:~/estudio/MigrationsGuides$ rake db:drop
trabajo@fernando:~/estudio/MigrationsGuides$ rake db:migrate
== ExampleMigration: migrating ===============================================
-- create_table(:categories)
-> 0.0019s
-- create_table(:users)
-> 0.0012s
-- create_table(:products)
-> 0.0007s
-- execute(" ALTER TABLE products\n ADD CONSTRAINT fk_products_categories\n FOREIGN KEY (category_id)\n REFERENCES categories(id)\n")
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: near "CONSTRAINT": syntax error: ALTER TABLE products
ADD CONSTRAINT fk_products_categories
FOREIGN KEY (category_id)
REFERENCES categories(id)
/home/trabajo/.rvm/gems/ruby-2.0.0-p481@MigracionesGuides/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `initialize'
/home/trabajo/.rvm/gems/ruby-2.0.0-p481@MigracionesGuides/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `new'
/home/trabajo/.rvm/gems/ruby-2.0.0-p481@MigracionesGuides/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `prepare'
/home/trabajo/.rvm/gems/ruby-2.0.0-p481@MigracionesGuides/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:134:in `execute'
答案 0 :(得分:2)
启用外键支持
为了在SQLite中使用外键约束,必须在未定义
SQLITE_OMIT_FOREIGN_KEY
或SQLITE_OMIT_TRIGGER
的情况下编译库。 [...]如果定义了OMIT_FOREIGN_KEY
,则甚至无法解析外键定义(尝试指定外键定义是语法错误)。
似乎您的SQLite是在定义了OMIT_FOREIGN_KEY
的情况下编译的。要么使用FK重新编译SQLite并启用触发器,要么(更好的IMO)安装一个完全支持FK的正确数据库并切换到该数据库;我建议使用PostgreSQL,但如果你已经拥有它,MySQL应该这样做。
在任何情况下,始终在您将要部署的同一数据库之上开发;这甚至适用于你正在玩游戏的东西。无论你使用什么数据库都会给你一些习惯,这些习惯不会被转移到其他数据库。提供数据库可移植性的ORM是一个神话,不会堕落。