在我正在处理的 PHP 项目中,我们需要创建一些 DAL 扩展来支持多个数据库平台。我们遇到的主要问题是不同的平台有不同的语法——值得注意的是 MySQL 和 MSSQL 是完全不同的。
最好的解决方案是什么?
这是我们讨论过的几个:
基于类的 SQL 构建
这将涉及创建一个允许您逐位构建 SQL 查询的类。例如:
$stmt = new SQL_Stmt('mysql');
$stmt->set_type('select');
$stmt->set_columns('*');
$stmt->set_where(array('id' => 4));
$stmt->set_order('id', 'desc');
$stmt->set_limit(0, 30);
$stmt->exec();
虽然单个查询确实涉及很多行。
SQL 语法重新格式化
此选项更简洁 - 它会读取 SQL 代码并根据输入和输出语言重新格式化它。然而,就解析而言,我认为这是一个慢得多的解决方案。
最佳答案
我推荐基于类的 SQL 构建并推荐 Doctrine , Zend_Db或 MDB2 .是的,如果它需要更多行来编写简单的选择,但至少你可以依赖解析器并且不需要重新发明轮子。
使用任何 DBAL 都需要在速度上进行权衡,而不仅仅是数据库执行,但是当您第一次使用其中任何一个时,都会比您真正熟悉它时更加痛苦。此外,我几乎 100% 确定生成的代码不是最快的 SQL 查询,但这是我之前所说的权衡。
最终取决于您,所以即使我不会这样做并且这肯定不是不可能的,但问题仍然存在,您是否可以通过实现自己的 DBAL 实际上节省时间和资源(从长远来看)。
关于sql - 数据库抽象——支持多种语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/216329/