【发布时间】:2015-11-25 14:10:57
【问题描述】:
我正在尝试在开发模式(使用 H2)下运行当前在生产中使用 PostgreSQL 数据库的设置,但出现错误。如果我可以重用生产 SQL 而无需对其进行任何更改,那将是最好的。
使用此设置:
# H2 Database
spring.datasource.datasource-class-name=org.h2.jdbcx.JdbcDataSource
spring.datasource.url=jdbc:h2:mem:userregistry;DB_CLOSE_DELAY=-1;MODE=PostgreSQL
这个查询:
CREATE TABLE IF NOT EXISTS users.user_userrole (
user_signum VARCHAR(20) NOT NULL,
role VARCHAR(255) NOT NULL,
CONSTRAINT user_userrole_pk PRIMARY KEY (user_signum, role),
CONSTRAINT user_fk FOREIGN KEY (user_signum) REFERENCES users.user (signum) MATCH SIMPLE,
CONSTRAINT role_fk FOREIGN KEY (role) REFERENCES users.userrole
(role_name) MATCH SIMPLE
);
引发此异常:
org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "<<SQL OMITTED FOR BREVITY>>";
expected "INDEX, ON, NOT, DEFERRABLE, NOCHECK, CHECK, ,, )"; [42001-185]
请注意,我已经在使用Mode=PostgreSQL。有什么想法吗?
谢谢
【问题讨论】:
-
另一个很好的例子说明为什么在生产和测试中使用不同的 DBMS 是个坏主意。无需更改即可“重用”生产 SQL 的唯一方法是在本地安装 Postgres。
-
在产品和测试中使用 2 个不同的数据库有什么意义。它不允许您探索数据库的问题,您可以在测试中找到这些问题,并修复要在生产中使用的代码。如果您只是更改数据库,那么您不仅是在浪费精力来解决问题以使用测试数据库,而且还会在事后完全更改数据库,因为您的努力在那时是无用的。
-
拥有一个开发内存数据库和一个“常规”产品数据库是一种扩展实践。特别是如果您以后使用诸如 JPA 之类的技术(例如在本例中,这是一个非常简单的 CRUD 业务逻辑)将您的代码与 DBMS 隔离开来。只要您不编写本机 SQL(这是遗留的,我无法更改),这是可以的。这就是问题所在。
-
你确定这是你在这个问题中引用的查询吗?因为根据错误消息,您的一个查询中有字符串文字“>”。尝试将 > 替换为 /* SQL OMMITTED FOR BREVITY */
-
是的,我写这个字面是为了不让这个问题读得太长:-)
标签: spring postgresql h2