我正在转换我的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还是有另一种方式?
答案 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 this和related post)
# add this require in config/application.rb
require 'active_record/connection_adapters/sqlite3_adapter'