翻译数据库查询
您是否曾经想过有一种工具可以同时翻译多种数据库语法?
目录
1. 序言
自 2018 年以来,我一直从事专业开发工作,当我决定开始编写功能测试时,最难决定的事情之一是:我应该使用哪个数据库作为测试用例的基础?
我为什么这么说?我的意思是,当时网上的大多数教程都建议我们使用 SQLITE,这很奇怪,因为你可能不会在生产环境中运行它。
据我所知,使用 PHP、C#、Java 和 Python 创建 CRUD 解决方案的视频和文章直接指向:
- 甲骨文
- MariaDB
- MySQL
- PostgreSQL
当然,这些数据库的语法存在很大差异。
2. 很久很久以前
这是我在一个非常具体的项目中决定在 SQLITE 和 MySQL 之间转换的众多脚本之一,我可以告诉你这是一件非常痛苦的事情!
作为一名初级/中级开发人员,接到一些可能不是解决问题的最佳方法的奇怪任务真是糟透了,主要是因为你必须在短时间内停下来研究数据库及其语法之间的差异。
由于ISO(国际标准化组织)和ANSI(美国国家标准协会)已经决定,如果要实现 SQL 标准,就必须实现该函数,因此函数本身的名称实际上并不重要。对吗?对吗?
聚合器、函数和任何其他类型的相关语法都可以用不同的风格编写,并且由于它是按照 SQL-92 标准实现的,因此将被识别为 SQL 数据库。
看一下下面的脚本:
-- Enabling Foreign Keys in different databases
SET CONSTRAINTS ALL DEFERRED; -- PostgreSQL
SET FOREIGN_KEY_CHECKS = 1; -- MySQL
PRAGMA foreign_keys = ON; -- SQLite
-- Disabling Foreign Keys in different databases
PRAGMA foreign_keys = OFF; -- SQLite
SET FOREIGN_KEY_CHECKS=0; -- MySQL
COMMIT; -- PostgreSQL (after disabling it)
您可以在不同的数据库中执行完全相同的操作,但找到可以从单一来源翻译该操作的工具并不常见。
3. 翻译 SQL
想象一个工具,它允许您用 SQL 编写语句,甚至是在数据库内执行的高阶函数。
该工具还可用于生成将要执行的相同查询,但适用于不同的关系数据库,甚至其他范例Wide Column
(如ScyllaDB,CassandraDB)。
你想象出来了吗?没有?那就让我来演示一下集算器吧!
esProc是一种强大的编程语言,可以作为数据仓库,具有许多功能,其中之一就是将查询语句转换为许多不同的数据库:
sql = select * from Orders where ADDDAYS(OrderDate,3) > ShipDate
sql.sqltranslate(MySQL) -> select * from Orders where (OrderDate + INTERVAL 3 DAY)>ShipDate
sql.sqltranslate(Oracle) -> select * from Orders where (OrderDate + NUMTODSINTERVAL(3, DAY)>ShipDate
sql.sqltranslate(DB2) -> select * from Orders where (OrderDate + 3 DAYS )>ShipDate
这是一种基于一种独特语言来使用许多数据库源的强大且有用的方法。
4. 最后的考虑
在一个项目中拥有多个数据库需要大量的抽象和实现,但是需要一个好的工具。
EsProc 可以为您带来许多探索的可能性,我将邀请您了解更多信息并在 Github 上为该存储库加注星标!
鏂囩珷鏉ユ簮锛�https://dev.to/danielhe4rt/translated-database-queries-3n0m