Rails 5 uuid issue with sqlite



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

我已更改迁移文件以使用id: :uuid

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

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

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

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

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

schema.rb 提供了一个提示,即"uuid"不是已知类型

# Could not dump table "projects" because of following StandardError
#   Unknown type 'uuid' for column 'id'

我建议我可以开始使用字符串类型而不是 sqlite3 的 uuid,但我打算使用 postgres 进行生产,并希望使用 uuid。

我应该在开发中使用 pg 还是有其他方法?

SQLite不是一个通用数据库,也没有完全实现SQL-92。你应该只将SQLite用于它的设计目的(主要是启用软件,缓存,...(。

如果你看一下这里在SQLite中使用UUIDs,你就会明白SQLite没有真正的UUID类型(BLOB(16)是最好的选择(。

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

我使用 Rails 5.2.1 和 sqlite3 让它工作。

以下是您需要的(请参阅此处(:

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

只有上述内容,我得到了与插入 sqlite3 时相同的约束冲突操作。 修复是这个(见这个,以及相关帖子(

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

最新更新