转换游戏!从MySQL到PostgreSQL的框架演变

时间:2014-04-01 17:44:29

标签: sql postgresql playframework ebean playframework-evolutions

我正在使用plaframework 2.2.1,我已经创建了一个项目MySQL,但现在我想将我的项目转移到PostgreSQL,但是重新创建数据库演变有一些错误。

我的旧进化(1.sql)for mysql运行良好是:

# --- Created by Ebean DDL
# To stop Ebean DDL generation, remove this comment and start using Evolutions

# --- !Ups

create table product (
  id                        bigint auto_increment not null,
  name                      varchar(255),
  price                     float,
  constraint pk_product primary key (id))
;

create table shop (
  id                        bigint auto_increment not null,
  name                      varchar(255),
  address_line1             varchar(255),
  address_line2             varchar(255),
  address_line3             varchar(255),
  city                      varchar(255),
  town                      varchar(255),
  phone_number              varchar(255),
  owner_email               varchar(255),
  constraint pk_shop primary key (id))
;

create table user (
  email                     varchar(255) not null,
  password                  varchar(255),
  first_name                varchar(255),
  last_name                 varchar(255),
  constraint pk_user primary key (email))
;


create table product_shop (
  product_id                     bigint not null,
  shop_id                        bigint not null,
  constraint pk_product_shop primary key (product_id, shop_id))
;
alter table shop add constraint fk_shop_owner_1 foreign key (owner_email) references user (email) on delete restrict on update restrict;
create index ix_shop_owner_1 on shop (owner_email);



alter table product_shop add constraint fk_product_shop_product_01 foreign key (product_id) references product (id) on delete restrict on update restrict;

alter table product_shop add constraint fk_product_shop_shop_02 foreign key (shop_id) references shop (id) on delete restrict on update restrict;

# --- !Downs

SET FOREIGN_KEY_CHECKS=0;

drop table product;

drop table product_shop;

drop table shop;

drop table user;

SET FOREIGN_KEY_CHECKS=1;

然后我删除了1.sql并为下面给出的postgresql重新创建了我的进化(1.sql)

 # --- !Ups

create table member (
  email                     varchar(255) PRIMARY KEY,
  password                  varchar(255),
  first_name                varchar(255),
  last_name                 varchar(255)
  )
;

create table product (
  id                        bigserial PRIMARY KEY,
  name                      varchar(255),
  price                     real
  )
;

create table shop (
  id                        bigserial PRIMARY KEY,
  name                      varchar(255),
  address_line1             varchar(255),
  address_line2             varchar(255),
  address_line3             varchar(255),
  city                      varchar(255),
  town                      varchar(255),
  phone_number              varchar(255),
  email                     varchar(255) REFERENCES member
  )
;


create table product_shop (
  product_id                     bigint REFERENCES product ON DELETE RESTRICT,
  shop_id                        bigint REFERENCES shop ON DELETE CASCADE,
  PRIMARY KEY (product_id, shop_id)
  )
;

两个sql之间有什么区别吗?

我是否需要添加一些内容以使我的新1.sql函数在我的mysql evolution中与我的旧1.sql相同?我的新进化创建了我的数据库,但是当我尝试在我的 shop 表中插入值时,它显示相同的页面,并且它与使用mysql的工作方式不同,意味着不加载下一页。在产品表中插入时,会显示此信息。

[PersistenceException: Error getting sequence nextval]
In C:\Users\Myproject\app\models\Product.java at line 36.
33
34    public static Product create(String name,float price) {
35        Product product = new Product(name, price);
36        product.save();
37        product.saveManyToManyAssociations("shops");
38        return product;
39    }
40    public static void delete(Long id) {
41        find.ref(id).delete();

我也无法在PgAdmin III中找到2.sql创建的数据库?

1 个答案:

答案 0 :(得分:0)

确保数据库处于一致状态。

假设您没有迁移先前MySQL数据库中的数据,并且您正在开发模式(不是生产模式),那么您不必担心保留数据:

  • 将迁移重命名为1.sql。仅仅因为你在以前的数据库中执行了迁移,这并不意味着当你要在一个全新的数据库中执行它时,这是第二次演变:对于新数据库,它仍然是第一个。
  • 声明您的主键列:id bigserial primary key并删除constraint
  • 确保PostgreSQL中有一个空数据库。删除数据库并重新创建(dropdbcreatedb)。
  • 运行数据库迁移并观察输出以确保执行迁移。见Managing database evolutions
  • 使用PgAdmin或Toad Extension for Eclipse等类似工具验证数据库结构是否已正确创建。

或者,您可能会发现Flyway提供了更全面的数据库迁移方法。 Play框架有plugin

要避免异常Error getting sequence nextval,请正确注释实体类定义,如下所示:

@Id
@SequenceGenerator(name="product_gen", sequenceName="product_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="product_gen")
@Column(name="id")
public Long getId() { return id; }

检查数据库以确保sequenceName是PostgreSQL创建的序列的名称。

有关详细信息,请参阅: