如何让Grails / GORM在postgres中使用默认序列值?

时间:2014-05-23 05:28:07

标签: sql postgresql grails orm gorm

当我定义域对象时:

class MusicPlayed {

  String user
  Date date = new Date()
  String mood

  static mapping = {
    id name: 'played_id'
    version false
  }

}

我得到一个自动定义的postgres序列,如:

CREATE SEQUENCE seq_music_played
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;

那很棒 - 但我很乐意让这个成为id字段的默认值。换句话说,我希望将表格定义为:

    played_id bigint DEFAULT nextval('seq_music_played'::regclass) NOT NULL,

......但这并没有发生。因此,当我的客户端代码需要手动SQL调用时,我不得不从序列中提取新值而不仅仅依赖于自动填充。

是否有任何方法可以创建此表"我想要的方式,"或者我是否需要放弃gorm的表创建魔法并使用在安装时运行的db-creation脚本自己创建表?


注意我的问题与How to set up an insert to a grails created file with next sequence number?类似,但我特意寻找的解决方案不会污染我的客户端代码。

4 个答案:

答案 0 :(得分:1)

我会用:

    static mapping = {
     id generator: 'native', params:[sequence:'your_seq']
    }

此外,我将通过

更新id列的DEFAULT-Value
ALTER TABLE your_table ALTER COLUMN id SET DEFAULT nextval('your_seq');

这对手动INSERT非常有用

更新 - 使用liquibase作为默认列问题:

changeSet(author:'Bosh', id:'your_table_seq_defaults', failOnError: true) {
sql ("ALTER TABLE your_table ALTER COLUMN id SET DEFAULT nextval('your_seq')")
}

答案 1 :(得分:1)

这对我有用: - )

 static mapping = {
    id generator: 'native', params: [sequence: 'my_seq'], defaultValue: "nextval('my_seq')"
 }

生成如下内容:

create table author (
    id int8 default nextval('nsl_global_seq') not null,...

用于postgresql。

答案 2 :(得分:0)

我倾向于直接在PostgreSQL中创建我的表,然后用grails映射它们。

我最好的想法来自这里的序列生成ID:

http://blog.wolfman.com/articles/2009/11/11/using-postgresql-with-grails

试一试,然后对你以前的问题微笑:)

拉​​维

答案 3 :(得分:-2)

您可以在Config.groovy

中定义它
grails.gorm.default.mapping = {
    id generator: 'sequence'
}