Rails 5与sqlite有关的问题

时间:2017-11-11 22:01:05

标签: ruby-on-rails postgresql sqlite uuid

我正在转换我的rails 5.1 app开始使用UUID而不是增量ID作为默认的active_record。

我已将迁移文件更改为使用

id: :uuid

我添加了一个迁移文件来支持'uuid-ossp'和'pgcrypto',因为我打算在prod中使用pg。

class CreateProjects < ActiveRecord::Migration[5.1]
  def change
    create_table :projects, id: :uuid do |t|
      t.string :title
      t.text :description

      t.timestamps
    end
  end
end

但是当我尝试创建一个对象时,我得到一个错误,好像id为null。

class EnablePgcryptoExtension < ActiveRecord::Migration[5.1] def change enable_extension 'uuid-ossp' enable_extension 'pgcrypto' end end

schema.rb提供了一个提示“uuid”不是已知类型

ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL constraint failed: projects.id: INSERT INTO "projects" ("created_at", "updated_at") VALUES (?, ?)

我建议我可以开始使用字符串类型代替uuid用于sqlite3,但我打算使用postgres进行制作,并希望使用uuids。

我应该在开发中使用pg还是有另一种方式?

2 个答案:

答案 0 :(得分:0)

SQLite不是通用DB,也不完全实现SQL-92。你应该只为了它的设计目的而使用SQLite(主要是启用软件,缓存......)。

如果您看一下Using UUIDs in SQLite,您就会明白SQLite没有真正的UUID类型(BLOB(16)是最佳选择。)

Mu Is To Short 所说,你必须在开发平台和生产平台之间使用相同的环境,否则你将面临很多麻烦...

答案 1 :(得分:0)

我使用Rails 5.2.1和sqlite3使其工作。

这就是您需要的(See this):

# config/application.rb
config.generators do |g|
  g.orm :active_record, primary_key_type: :uuid
end

只有上述情况,插入sqlite3时遇到了相同的约束违规操作。解决方法是这样的(See thisrelated post

# add this require in config/application.rb
require 'active_record/connection_adapters/sqlite3_adapter'