我正在转换我的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'