2017-03-06 54 views
0

我想问问,如果和它是如何能够使使用基于PHP的应用程序独立于SQL引擎的?构建应用程序独立的SQL引擎的使用

(在我的意思是,应用程序可以在PostgreSQL的,MySQL的执行,也许还是Oracle SQL)

目前的想法是离开PDO DSN到配置文件,从而使查询等一切保持不变,但是我可以面对表格本身的CRUD操作时遇到一些问题吗?

如果我不在其中添加任何复杂的东西,那么是否有可能使它完全不依赖于引擎,只有PDO DSN用于数据库,并且它可以在每个SQL引擎上以相同的方式查询所有内容?

此致敬礼!

+2

如果你想成为独立的,你将不得不写为每个可能的发动机具有相同签名的“DB驱动程序”。 – Jerodev

+1

使用原则或其他一些ORM。 – ShiraNai7

+1

根据每个SQL引擎将使用的不同方言,您将面临一些问题。没有一个完全标准的“SQL”语法是mySQL,Oracle和其他人共有的。所以我同意@ ShiraNai7,你最好不要重新发明weel。 –

回答

2

阅读有关数据库抽象层。 PHP中有相当多的库可用。如果您选择任何流行的框架,请参阅Symfony或Laravel - 您将拥有开箱即用的DBAL - 教义或雄辩。两者都提供了类似的查询构建功能,基于HQL的IMO。

绝对尝试将它写“自己的方式”。即使你只是简单的查询的文法是不同的,更何况只是类型,递增等等

2

如果你坚持的是由所有的目标数据库支持的SQL的一个共同的子集,那么,你可以放弃使用相同的PDO实例,相同的查询,并只需切换PDO DSN。然而

实事求是地讲,任何东西,但最琐碎的查询,你可能会使用它,你必须执行稍有不同的数据库,不同数据库的一些特定功能。简单地说,这意味着如果连接到MySQL,代码将不得不执行查询A,但如果连接到Postgres,则代码将稍有不同。

你肯定不想使用大量的if..else来实现,而是你想要使用数据库特定的适配器/驱动程序。在您的业务代码中,您将调用$database->getUserRecords(),并根据$database是否使用MySQL或Postgres适配器,查询会稍有不同。 (另见依赖注入

您可以通过实施由专人这些适配器和调整查询每个数据库做到这一点,或使用更抽象的ORM/DBAL可使用装配在飞行正确的查询特定于数据库的查询构建器。有很多现有的库。