5

postgresql を使用して play20 アプリケーションを動作させようとしているので、使用して後で Heroku にデプロイできます。私はこの答えに従いました。

基本的に、データベースに接続しました(ローカルアプリケーションからHeroku postgresqlデータベースへの接続は機能しました)が、生成された1.sqlの進化でデータベースを初期化できませんでした。しかし、postgresql がスキーマを使用しているため、生成された sql は機能しませんでした(とにかくスキーマなしで機能するはずですが、どうやら私が何か間違っているか、データベースが何か間違っているようです)。

create table user (
id                        bigint not null,
email                     varchar(255),
gender                    varchar(1),
constraint pk_user primary key (id));

をもたらしました

ERROR: syntax error at or near "user"
  Position: 14 [ERROR:0, SQLSTATE:42601]

テーブル名にスキーマを追加して修正しました

create table public.user(
  ...
);

OK、データベースの読み取りまたは書き込みを試みるまで、すべてが機能しました。SQL 構文の例外が再び発生し、データベースを操作できません。SQLクエリが何らかの形で間違っているようです。

問題になる可能性のある提案はありますか?

4

2 に答える 2

8

これは、本番環境以外のデータベースを使用してアプリケーションを開発する際によくある間違いですが、幸いなことに、一般的な解決策もあります。モデルは引き続き使用できUserますが、名前が変更されたデータベース テーブルが作成されることを確認する必要があります。

@Entity
@Table(name = "users")
public class User extends Model {
    ...
}

ほとんどの場合、コントローラーとモデルの名前スイッチは透過的です。スイッチを覚えておく必要があるのは、RawSqlクエリだけです。

ところで、開発のために同じデータベースをローカルにインストールすることをお勧めします。他の予約済みキーワード、他の許可されたタイプ、さらには id の他の自動インクリメント方法など、ほとんどの一般的なデータベースには多くの違いがあるため、適切な値を見つけて修正するのは簡単です。ローカルホストで。

于 2012-09-04T05:45:58.023 に答える
2

さて、postgresqlについての私の知識がほとんどなかったため、私はこれに一日中苦労していました。これが簡単な解決策です。postgreqslで「user」というテーブルを使用しないでください。このテーブルはすでに使用されています。

しかし、なぜ私の進化SQLクエリがデータベースの初期化に機能したのですか?テーブル「user」を作成するスキーマを明示的に指定すると、基本的に機能します。

ただし、スキーマが指定されていない場合は、現在のスキーマが使用されます。ドキュメントから:

スキーマ名が指定されている場合(たとえば、CREATE TABLE myschema.mytable ...)、テーブルは指定されたスキーマで作成されます。それ以外の場合は、現在のスキーマで作成されます

だからそれはそれを説明します。しかし、私のプロジェクトでは、「ユーザー」モデルを使用することは完全に合理的であり、H2ファイルベースのデータベースでは機能していたので、問題は別の場所にあると思いました...

于 2012-09-03T23:15:59.330 に答える