SQLite3 :: SQLException:near" CONSTRAINT":语法错误

时间:2014-07-31 22:19:03

标签: ruby-on-rails ruby ruby-on-rails-3 sqlite ruby-on-rails-4

你能帮我解决这个问题。首先,我创建一个生成三个表的迁移。然后我尝试执行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'

1 个答案:

答案 0 :(得分:2)

来自fine SQLite manual

  

启用外键支持

     

为了在SQLite中使用外键约束,必须在未定义SQLITE_OMIT_FOREIGN_KEYSQLITE_OMIT_TRIGGER的情况下编译库。 [...]如果定义了OMIT_FOREIGN_KEY,则甚至无法解析外键定义(尝试指定外键定义是语法错误)。

似乎您的SQLite是在定义了OMIT_FOREIGN_KEY的情况下编译的。要么使用FK重新编译SQLite并启用触发器,要么(更好的IMO)安装一个完全支持FK的正确数据库并切换到该数据库;我建议使用PostgreSQL,但如果你已经拥有它,MySQL应该这样做。

在任何情况下,始终在您将要部署的同一数据库之上开发;这甚至适用于你正在玩游戏的东西。无论你使用什么数据库都会给你一些习惯,这些习惯不会被转移到其他数据库。提供数据库可移植性的ORM是一个神话,不会堕落。