在dev中使用H2,在prod中使用Postgresql

时间:2014-12-10 02:07:48

标签: postgresql playframework-2.0 h2 playframework-evolutions

在Play Framework中,我使用evolutions来管理数据库迁移。我还使用H2组合开发和测试,Postgresql组合生产。但是,H2似乎UPPERCASE所有的表名和列名,而Postgresql却恰恰相反。

有没有办法让这两个数据库一起玩得很好?

以下是我的application.conf的摘录:

db.default.driver = org.h2.Driver
db.default.url = "jdbc:h2:mem:play;MODE=PostgreSQL"
db.default.user = ""
db.default.password = ""

# db.default: {
#  driver = org.postgresql.Driver
#  url = "jdbc:postgresql://127.0.0.1/khanguyen"
#  user = khanguyen
#  password = ""
# }

我使用Slick 2.1.0

2 个答案:

答案 0 :(得分:1)

可以选择在H2中忽略大小写,如post中所述。

我的application.conf现在是这样的:

db.default.driver = org.h2.Driver
db.default.url = "jdbc:h2:mem:play;MODE=PostgreSQL;IGNORECASE=TRUE"
db.default.user = ""
db.default.password = ""

答案 1 :(得分:1)

我之前的回答是错误的。在运行Ubuntu的机器上,我不知道它为什么会在短时间内工作。

对于区分大小写的数据库系统(如H2或Postgresql),如果要保留字符大小写,则应使用围绕所有表和列名称的双引号。

演变将如下所示:

CREATE TABLE "products" (
    "ean" bigserial NOT NULL,
    "name" varchar(255) NOT NULL,
    "expiration_date" date NOT NULL,
    "expiration_time" time NOT NULL,
    PRIMARY KEY ("ean")
);

然后H2和Postgres将使用小写字符创建此表。或者:

CREATE TABLE "PRODUCTS" (
    "EAN" bigserial NOT NULL,
    "NAME" varchar(255) NOT NULL,
    "EXPIRATION_DATE" date NOT NULL,
    "EXPIRATION_TIME" time NOT NULL,
    PRIMARY KEY ("EAN")
);

然后H2和Postgres都会用UPPERCASE字符创建这个表。