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

serialまたは、列の値が取得されるバックグラウンドでシーケンスbigserial を作成します。したがって、挿入は基本的に正しいです。

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

編集:
そのツールが間違った命名規則を想定している場合に考えられる回避策の 1 つは、生成されたシーケンスの名前を変更することです。Postgres はそれが列に属していることを「認識」しているため、問題は解決しません。

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