java使用h2包含.sql_java – H2 postgresql模式似乎不适合我

So I thought of using H2 Posgresql compatibility mode by thinking all postgres queries will work on H2 please correct me if I am wrong

恐怕不是这样.

H2尝试模拟Postgresql语法并支持一些功能和扩展.它不会完全匹配Postgresql的行为,并且不支持所有功能.

你唯一的选择是:

>在测试中使用Postgresql要么

>停止使用H2不支持的功能

我建议使用Pg进行测试.编写initdb的postgres实例的测试工具相对来说比较简单,然后启动测试工具进行测试,然后将其撕下来.

更新基于评论:

“单位”和“整合”测试之间没有硬线.在这种情况下,H2也是外部组件.纯粹的单元测试将有一个虚拟的响应者查询作为测试工具的一部分.对H2的测试与对Postgresql的测试一样是一个“集成”测试.它在进程和内存中的事实是一个方便,但不是功能上的重要.

如果要进行单元测试,应该为应用程序编写另一个数据库目标,以便与“Postgresql”,“SybaseIQ”等目标一起使用.称之为“MockDatabase”.这应该只是从查询返回预期的结果.它没有真正运行查询,它只存在来测试其余代码的行为.

就个人而言,我认为这是一个巨大的时间浪费,但是这是纯粹主义者的一个单位测试,以避免将外部依赖性引入到测试工具中.

如果您坚持使用单元(而不是集成)对您的DB组件进行测试,但是不能/不会写入模拟界面,则必须找到一种使用现有模块的方法. H2将是合理的候选对象 – 但是您必须使用新的可用于H2的查询集编写新的后端,不能仅仅重新使用Postgresql后端.正如我们已经建立的,H2不支持您需要使用Postgresql的所有功能,因此您必须找到与H2完全相同的方法.一个选择是使用“预期”结果创建一个简单的H2数据库,并返回这些结果的简单查询,完全忽略实际应用程序的架构.这里唯一真正的缺点是,维护可能是一个重大的痛苦…但这是单元测试.

就我个人而言,我只是用Postgresql测试.除非我正在测试独立的单独的课程或模块,这些单独的单元是狭窄接口的定义良好的单元,我不在乎是否有人称之为“单元”或“集成”测试.我会单元测试,比如数据验证类.对于数据库接口代码,纯粹的单元测试没有什么意义,我只需要进行集成测试.

虽然具有进程内存数据库方便,但不是必需的.您可以编写测试工具,以便设置代码initdbs一个新的Postgresql并启动它;那么拆卸代码会杀死postmaster并删除datadir.我在this answer写了更多关于这个.

也可以看看:

至于:

If all queries with expected end datasets works fine in Postgress I can assume it will work fine in all other dbs

如果我明白你正在说的正确,那么是的,那就是这种情况 – 如果你的代码的其余部分与Postgresql中的数据集一起工作,它通常与包含来自另一个数据库的相同数据的数据集相同.只要它使用简单的数据类型,不是数据库特定的功能,当然.

SELECT a.company_code, a.company_name, a.gl_account_nbr, a.clearing_date, a.clear_account_document_nbr, a.doc_assignment, a.fiscal_year, a.gl_document_nbr, a.document_item_nbr, a.doc_posting_date, a.document_date, a.document_currency, a.doc_reference, a.document_type, a.fiscal_period, a.doc_posting_key, a.doc_account_debit_or_credit, a.business_scope, a.doc_tax_code, a.doc_local_currency_amount, a.doc_currency_amount, a.tax_amount_standard, a.doc_currency_tax, a.doc_item_text, a.doc_source_order_nbr, a.plant_code, a.cost_center, a.doc_payment_starting_date, a.doc_open_item_management, a.doc_value_date, a.bpm_order_no, a.process_code, a.paymethod, a.paystract, a.zshare_ctr, a.cl_document_nbr, a.handling_accountant, a.handling_accountant_name, a.z_proid, a.pernr, a.dr_amount, a.cr_amount, a.paymethod_name, a.gl_account_name, a.anti_accounting_mark, a.enter_time, a.wb_debit_amount, a.wb_crebit_amount, a.ts_ms, a.cnt FROM ( SELECT a_1.company_code, a_1.company_name, a_1.gl_account_nbr, a_1.clearing_date, a_1.clear_account_document_nbr, a_1.doc_assignment, a_1.fiscal_year, a_1.gl_document_nbr, a_1.document_item_nbr, a_1.doc_posting_date, a_1.document_date, a_1.document_currency, a_1.doc_reference, a_1.document_type, a_1.fiscal_period, a_1.doc_posting_key, a_1.doc_account_debit_or_credit, a_1.business_scope, a_1.doc_tax_code, a_1.doc_local_currency_amount, a_1.doc_currency_amount, a_1.tax_amount_standard, a_1.doc_currency_tax, a_1.doc_item_text, a_1.doc_source_order_nbr, a_1.plant_code, a_1.cost_center, a_1.doc_payment_starting_date, a_1.doc_open_item_management, a_1.doc_value_date, a_1.bpm_order_no, head.procode AS process_code, payment.paymethod, a_1.paystract, a_1.zshare_ctr, a_1.cl_document_nbr, CASE WHEN head.pernrjb IS NOT NULL AND head.pernrjb <> ‘’::text THEN head.pernrjb ELSE bkpf.usnam END AS handling_accountant, pa001.sname AS handling_accountant_name, head.proid AS z_proid, head.pernr, a_1.dr_amount, a_1.cr_amount, payment.paymethodtxt AS paymethod_name, a_1.gl_account_name, a_1.anti_accounting_mark, a_1.enter_time, a_1.wb_debit_amount, a_1.wb_crebit_amount, a_1.ts_ms, row_number() OVER (PARTITION BY a_1.company_code, a_1.gl_account_nbr, a_1.fiscal_year, a_1.fiscal_period, a_1.gl_document_nbr, a_1.document_item_nbr ORDER BY head.procode DESC) AS cnt FROM table_01 a_1 LEFT JOIN dwd_ztbpm_payment_view payment ON a_1.bpm_order_no = payment.orderno LEFT JOIN dwd_ztfi_trpay_view trpay ON a_1.bpm_order_no = trpay.orderno LEFT JOIN dwd_bkpf_r bkpf ON bkpf.bukrs = a_1.company_code AND bkpf.gjahr = a_1.fiscal_year AND bkpf.belnr = a_1.gl_document_nbr LEFT JOIN dwd_ztbpm_post_head_r head ON a_1.bpm_order_no = head.orderno LEFT JOIN dwd_pa0001_r pa001 ON pa001.pernr = head.pernrjb) a WHERE a.cnt = 1 用rownumber会导致sql运行较慢,该怎么改能让sql运行快一点且数据结果与之前保持一致 DISTINCT ON 支持 改完后的sql具体给我写一下
最新发布
03-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值