1

当我尝试使用 Squeryl 的 Table.insert 在 PostgreSQL 表中插入新记录时,它会触发以下查询:

insert into "users" ("id", "email", "fullname") values (nextval('"s_users_id"'),?,?)

这不起作用,因为我没有定义序列,而是将 id 列定义为“自动增量”:

CREATE TABLE Users (
    id BIGSERIAL,
    email varchar(255) NOT NULL,
    fullname varchar(255),
    PRIMARY KEY (id)
);

我在另一个论坛上阅读了一些关于这个问题的旧帖子,我想知道现在的状态是什么。我们是否不鼓励使用自动增量并改为定义序列?或者有一个简单的解决方法可以让它工作吗?

编辑:实际上我刚才看到自动增量本身创建了一个序列,但使用了另一个名称:users_id_seq 有没有办法告诉 Squeryl 改为查看这个名称,或者遵循 PostgreSQL 的约定?

4

3 回答 3

8

您可以声明序列的名称:

 case class Author(id: Long, firstName: String)             

 val author = table[Author]

 on(author)(s => declare(
    s.id is(autoIncremented("your_seq_name"))
 ))

更多信息:http ://squeryl.org/schema-definition.html

于 2012-10-13T19:49:09.750 回答
5

目前还没有一种非常干净的方法可以做到这一点,但可以做到。只需继承 PostgreSqlAdapter 并覆盖:

def createSequenceName(fmd: FieldMetaData)

于 2012-10-09T17:56:15.063 回答
3

serialbigserial 在后台创建一个序列,从中获取列的值。所以插入基本上是正确的。

bigserial只是以下的简写:

create sequence users_id_seq;
create table users (id bigint default nextval('users_id_seq'));

唯一看起来错误的是,您的 id 列的序列的默认名称将是users_id_seq,而不是s_users_id您的工具使用的。

手册中的更多详细信息:http ://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL

编辑
如果该工具假定错误的命名约定,一种可能的解决方法是重命名生成的序列。正如 Postgres“知道”它属于该列的那样,事情仍然可以工作。

ALTER SEQUENCE users_id_seq RENAME TO s_users_id;
于 2012-10-09T06:59:55.663 回答