【问题标题】:How do I use migrations to create a postgres sequence?如何使用迁移来创建 postgres 序列?
【发布时间】:2011-01-17 02:20:10
【问题描述】:

如何使用迁移来创建 postgres 序列?

我创建了一个包含以下执行的迁移文件:

execute 'CREATE SEQUENCE "ServiceAvailability_ID_seq";'
execute <<-SQL
  ALTER TABLE "ServiceAvailability" 
    ALTER COLUMN "ID" set DEFAULT NEXTVAL("ServiceAvailability_ID_seq")
SQL

但是,在运行 rake db:migrate 时出现以下错误:

PGError:错误:列“ServiceAvailability_ID_seq”不存在 :更改表“服务可用性” ALTER COLUMN "ID" 设置 DEFAULT NEXTVAL("ServiceAvailability_ID_seq")

第二个问题,rake db:schema:dump 旨在创建一个可移植地用于任何数据库的文件,但是,在调查 schema:dump 时,它似乎只包含表、字段和字段类型信息并且错过了索引和序列?

【问题讨论】:

  • 为什么还要手动创建序列?当 rails 创建 id 列时,它会将其键入为 serial,这会创建一个隐式序列。而且 rails 应该可以很好地读取索引。
  • No rails 不会将 id 列输入为序列,而是输入为整数并应用序列。 [Postgresql 官方][1] doc 解释说是一样的。例如:CREATE TABLE nom_de_table (nom_de_colonne SERIAL);与 CREATE SEQUENCE nom_de_table_nom_de_colonne_seq 相同;创建表 nom_de_table ( nom_de_colonne integer NOT NULL DEFAULT nextval('nom_de_table_nom_de_colonne_seq') NOT NULL ); ALTER SEQUENCE nom_de_table_nom_de_colonne_seq OWNED BY nom_de_table.nom_de_colonne; [1]: docs.postgresqlfr.org/9.1/datatype.html#datatype-numeric

标签: ruby-on-rails heroku


【解决方案1】:

成功了

    execute 'CREATE SEQUENCE ServiceAvailability_ID_seq;'
execute <<-SQL
  ALTER TABLE "ServiceAvailability" 
    ALTER COLUMN "ID" set DEFAULT NEXTVAL('ServiceAvailability_ID_seq');
SQL

【讨论】:

  • 为了让它对我有用,我必须删除它们出现的双引号。
【解决方案2】:

实际上您不应该使用这样的迁移,将来如果您将数据库更改为 MySQL 或任何其他数据库(支持 Rails),您将面临问题。请查看下方链接中的 Ruby on Rails 指南。

http://guides.rubyonrails.org/migrations.html

【讨论】:

  • 由于使用了序列,这已经是 Postgres 特定的请求了。
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 2022-08-19
  • 2020-03-13
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多