我的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;
答案 0 :(得分:3)
如@a_horse_with_no_name所述,串行列正在使用序列。在Slick
中,您只需要使用AutoInc
定义列,在您的情况下:
def id = column[Int]("id", O.AutoInc, O.PrimaryKey)
在PostgreSQL
列定义Serial
列时,您只需返回Int
列Default 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
。