Tan*_*vir 8 postgresql activerecord ruby-on-rails rails-postgresql rails-activerecord
我正在开发一个Ruby on Rails应用程序.我们正在使用PostgreSQL数据库.
有一个以scores
下列列命名的表:
Column | Type
--------------+-----------------------
id | integer
value | double precision
ran_at | timestamp
active | boolean
build_id | bigint
metric_id | integer
platform_id | integer
mode_id | integer
machine_id | integer
higher_better | boolean
job_id | integer
variation_id | integer
step | character varying(255)
Run Code Online (Sandbox Code Playgroud)
我需要一个添加序列来job_id
(注:没有模型job
).
如何创建此序列?
Erw*_*ter 31
CREATE SEQUENCE scores_job_id_seq; -- = default name for plain a serial
Run Code Online (Sandbox Code Playgroud)
然后添加一个默认列scores.job_id
:
ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');
Run Code Online (Sandbox Code Playgroud)
如果要将序列绑定到列(因此在删除列时将其删除),还要运行:
ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;
Run Code Online (Sandbox Code Playgroud)
所有这一切都可以使用伪数据类型被替换serial
为列job_id
开始与:
如果您的表已有行,您可能需要将其设置SEQUENCE
为下一个最高值并在表中填写缺少的序列值:
SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;
Run Code Online (Sandbox Code Playgroud)
可选:
UPDATE scores
SET job_id = nextval('scores_job_id_seq')
WHERE job_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
唯一剩下的差异,serial
列也设置为NOT NULL
.您可能也可能不想要这样:
ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
Run Code Online (Sandbox Code Playgroud)
但是你不能只改变现有的类型integer
:
ALTER TABLE scores ALTER job_id TYPE serial;
Run Code Online (Sandbox Code Playgroud)
serial
不是实际的数据类型.它只是一个符号的便利功能CREATE TABLE
.
在Postgres 10或更高版本中考虑一IDENTITY
列:
Tan*_*vir 16
所以我想出了如何在Ruby on Rails上使用ActiveRecord迁移来实现这一点.我基本上从这个页面使用了Erwin的命令和帮助,并将它们放在迁移文件中.这些是步骤:
1.在终端中输入:
rails g migration CreateJobIdSequence
rails g migration AddJobIdSequenceToScores
Run Code Online (Sandbox Code Playgroud)
2.编辑迁移文件,如下所示:
20140709181616_create_job_id_sequence.rb:
class CreateJobIdSequence < ActiveRecord::Migration
def up
execute <<-SQL
CREATE SEQUENCE job_id_seq;
SQL
end
def down
execute <<-SQL
DROP SEQUENCE job_id_seq;
SQL
end
end
Run Code Online (Sandbox Code Playgroud)
20140709182313_add_job_id_sequence_to_scores.rb:
class AddJobIdSequenceToScores < ActiveRecord::Migration
def up
execute <<-SQL
ALTER SEQUENCE job_id_seq OWNED BY scores.job_id;
ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('job_id_seq');
SQL
end
def down
execute <<-SQL
ALTER SEQUENCE job_id_seq OWNED BY NONE;
ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
SQL
end
end
Run Code Online (Sandbox Code Playgroud)
3.迁移数据库.在终端类型中:
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11417 次 |
最近记录: |