光滑使用Postgres序列而不是串行

时间:2014-05-21 03:23:03

标签: postgresql scala slick

我的postgres中有一个现有的架构,我想使用Slick,如何强制执行此id列以在Slick中使用postgres序列?

class User(id: Int, first: String, last: String)

class Users(tag: Tag) extends Table[Int](tag, "users") {
  def id = column[Int]("id", O PrimaryKey)
  def * = id
}
val users = TableQuery[Users]

val usersSequence = Sequence[Int]("users_seq") start 1 inc 1

这是我现有的架构:

create table users (
  id                 bigint not null,
  ...
)
create sequence users_seq;

1 个答案:

答案 0 :(得分:3)

如@a_horse_with_no_name所述,串行列正在使用序列。在Slick中,您只需要使用AutoInc定义列,在您的情况下:

def id = column[Int]("id", O.AutoInc, O.PrimaryKey)

PostgreSQL列定义Serial列时,您只需返回IntDefault Value: nextval('user_id_seq'::regclass),这是用于递增值的序列。

无需在架构代码中手动创建序列:

class User(id: Int, first: String, last: String)

class Users(tag: Tag) extends Table[Int](tag, "users") {
  def id = column[Int]("id", O.AutoInc, O.PrimaryKey)
  def * = id
}

val users = TableQuery[Users]

评论后编辑:

我运行了你的sql语句,为序列添加了表alter:

create table users (
  id                 bigint not null
);

create sequence users_seq;
alter table users alter column id set default nextval('users_seq');

现在,在我的数据库中,我有一个表id类型为Int的表,默认值为序列:nextval('users_seq'::regclass)。这与我之前写过的相同,你有一个表格,其序列应用于id列,光滑的代码也不会改变,你可以尝试在本地数据库上运行它。

请注意,您的sql语句错误,您确实创建了一个序列,但它没有分配给任何列,您必须使用alter或直接添加一个列,其序列如here所示。希望这更清楚。

P.S。我不能完全确定的一件事是BigInt Postgres字段被映射到Scala Long,但可能与序列无关,但不确定,为了保持一致性,我总是将它们映射到Long