【问题标题】:Use H2 in dev and Postgresql in prod在 dev 中使用 H2,在 prod 中使用 Postgresql
【发布时间】:2014-12-10 02:07:48
【问题描述】:

在 Play Framework 中,我使用进化来管理数据库迁移。我还将 H2 组合用于开发和测试,将 Postgresql 用于生产。但是,H2 似乎将所有表名和列名都大写,而 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

【问题讨论】:

  • 您的 application.conf 文件的数据库 url 中是否有 MODE=PostgreSQL
  • 是的。我认为这会有所帮助,但它没有。
  • 如果您使用其中一个 ORM,则 ORM 应该处理未加引号的标识符。如果没有,您可能必须自己引用 all 标识符。
  • 我忘了补充说我使用的是 Slick 2.1.0。

标签: postgresql playframework-2.0 h2 playframework-evolutions


【解决方案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 = ""

【讨论】:

    【解决方案2】:

    我之前的回答是错误的。我不知道为什么它在运行 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 都会使用大写字符创建这个表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-11
      • 2013-02-10
      • 2022-01-19
      • 2019-07-31
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多