ruby-on-rails - SQLite3::SQLException:在“CONSTRAINT”附近:语法错误

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

您能帮我解决这个问题吗?首先,我创建一个迁移,该迁移生成三个表。然后我尝试执行一个SQL查询,但由于某种原因触发了错误
我是新手。我正在阅读第四版(4.0.6 Ruby On Rails)中的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'

最佳答案

fine SQLite manual


启用外键支持

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


似乎您的SQLite是使用OMIT_FOREIGN_KEY定义的编译的。重新编译启用了FK和触发器的SQLite,或者(更好的是IMO)立即安装一个完全支持FK的适当数据库,然后切换到该数据库;或者我建议使用PostgreSQL,但MySQL应该这样做(如果您已经拥有的话)。

无论如何,请始终在要部署的数据库上进行开发;这甚至适用于您想玩的东西。无论您使用哪种数据库都会给您带来习惯,而这些习惯不会转移到其他数据库中。提供数据库可移植性的ORM只是一个神话,请不要迷恋它。

关于ruby-on-rails - SQLite3::SQLException:在“CONSTRAINT”附近:语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069864/

相关文章:

ruby-on-rails - 如何返回数组中可能存在的一组序号?

ruby-on-rails - 深层嵌套属性和 attr_accessible

ruby-on-rails - 为什么不能在 Controller 测试中使用路由器路径?

ruby-on-rails - PG :ConnectBad Rails 4 Postgresql

ruby-on-rails - Heroku上的Rails ActionMailer拦截器

ruby - 守卫监视文件的控制台中没有 rspec 输出

ruby-on-rails - 如何使用 ruby​​ on rails 构建多维数组

ruby-on-rails - Rails 4, Assets 管道导致用户可下载文件被下载两次

ruby - Ruby 中的符号

用于使用 xsd :import 使用 Web 服务 wsdl 的 Ruby gem