【发布时间】:2017-04-05 04:55:23
【问题描述】:
发现 rails 5 有一个原生的uuid integration,想尝试一下,但我收到了这个错误:
== 20170330041631 EnableUuidExtension: migrating ==============================
-- enable_extension("uuid-ossp")
-> 0.0000s
== 20170330041631 EnableUuidExtension: migrated (0.0001s) =====================
== 20170331035925 CreateUsers: migrating ======================================
-- create_table(:users, {:id=>:uuid})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'uuid PRIMARY KEY, `name` varchar(255), `username` varchar(255), `password_digest' at line 1: CREATE TABLE `users` (`id` uuid PRIMARY KEY, `name` varchar(255), `username` varchar(255), `password_digest` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB
/home/zetacu/projects/rails-5-test/db/migrate/20170331035925_create_users.rb:3:in `change'
/home/zetacu/.rbenv/versions/2.4.0/bin/bundle:22:in `load'
/home/zetacu/.rbenv/versions/2.4.0/bin/bundle:22:in `<main>'
ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'uuid PRIMARY KEY, `name` varchar(255), `username` varchar(255), `password_digest' at line 1: CREATE TABLE `users` (`id` uuid PRIMARY KEY, `name` varchar(255), `username` varchar(255), `password_digest` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB
/home/zetacu/projects/rails-5-test/db/migrate/20170331035925_create_users.rb:3:in `change'
/home/zetacu/.rbenv/versions/2.4.0/bin/bundle:22:in `load'
/home/zetacu/.rbenv/versions/2.4.0/bin/bundle:22:in `<main>'
Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'uuid PRIMARY KEY, `name` varchar(255), `username` varchar(255), `password_digest' at line 1
/home/zetacu/projects/rails-5-test/db/migrate/20170331035925_create_users.rb:3:in `change'
/home/zetacu/.rbenv/versions/2.4.0/bin/bundle:22:in `load'
/home/zetacu/.rbenv/versions/2.4.0/bin/bundle:22:in `<main>'
Tasks: TOP => db:migrate
这是根据帖子进行的迁移:
class EnableUuidExtension < ActiveRecord::Migration[5.0]
def change
enable_extension 'uuid-ossp'
end
end
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users, id: :uuid do |t|
t.string :name
t.string :username
t.string :password_digest
t.timestamps
end
end
end
在application.rb:
config.generators do |g|
g.orm :active_record, primary_key_type: :uuid
end
我缺少什么?Rails-5 是否支持 mysql 或者必须像 Rails-4 那样手动?
create_table :users, id: false do |t|
t.string :uuid, limit: 36, primary: true, null: false
...
宝石版本:
rails (~> 5.0.2)
mysql2 (>= 0.3.18, < 0.5)
【问题讨论】:
-
FWIW,uuid-ossp 是一个 postgresql 扩展。因此,您的上述代码仅在使用 postgresql 后端时才有效。对于 mysql,您需要一个字符串列,就像您在自己的答案中指出的那样。
-
是的,这就是为什么我问
Rails 5-MySQL是否有内置方法可以做到这一点,但我找不到解决方案。
标签: mysql ruby-on-rails ruby-on-rails-5