eufony/dbal

零配置可扩展的PHP数据库抽象层库。

v0.1.0-beta1 2023-02-07 18:23 UTC

This package is auto-updated.

Last update: 2024-09-13 10:51:45 UTC


README

Packagist Downloads GitHub Stars Issues
License Community Built

eufony/dbal 为 SQL 提供了一个抽象层,以简化使用关系数据库管理系统的开发,并防止锁定到特定的 SQL 味道。

eufony/dbal 是一个 PHP 库,用于处理与您选择的数据库的接口。它使用一个表达式的语法,然后即时将其转换为适合您的 SQL 味道的语法。使用它,您将享受到纯 SQL 的所有好处,加上

  • PSR-3 兼容的数据库事件日志记录。
  • 使用任何 PSR-6PSR-16 兼容的缓存实现进行查询结果的透明缓存。
  • 使用预处理语句轻松防止 SQL 注入攻击。
  • 轻松序列化和反序列化任何有效的 PHP 类型。

感兴趣吗? 这里是开始的方法。

常见问题解答

为什么不直接编写自己的 SQL 查询呢?

普通 SQL 的问题是,“SQL”不幸地并不指代单一的东西。相反,它有不同的“味道”,每种都有其语法和功能支持的细微差别。没有人编写“SQL”查询。您总是必须针对特定的味道。

“好吧,如果我只使用 SQL 标准中的函数和语法会怎样?”

尽管 ANSI 和 ISO 都有这样一个 SQL “标准”,但在尝试编写符合该标准的查询时,您会迅速面临两个问题

  1. 一些非常基本的功能,例如 MySQL 的 LIMITOFFSET 关键字的功能,在标准指令集中神秘地缺失。在这种情况下,您被迫以试图达到相同结果的方式修改您的查询,或者放弃,只针对特定的味道,这可能会(将)导致以后的移植问题。

  2. 不同的 SQL 味道在遵守标准方面存在极大的差异。虽然 PostgreSQL 和 SQLite 在很大程度上是兼容的(至少在核心标准上,不考虑各种扩展),但您仍会遇到一些细微的差异,以非常微妙的方式破坏事情,否则可能不会被注意到。试图考虑这些差异将给开发带来重大开销,并通常会使后端基础设施的工作变得不具吸引力。

eufony/dbal 为您解决这些问题。作为一个抽象层,作为开发者的您无需担心输出端的语法。如果您想迁移版本,只需切换到任何现成的驱动实现;或者,如果不存在,可以贡献创建自己的。此外,您在从PHP与数据库交互时还能享受到一些便利,例如透明日志记录、缓存和PHP与SQL数据类型之间的转换。

为什么不用一个更成熟的项目呢?

因为将关键基础设施托付给未经测试、无资金支持的崭新项目既有趣又刺激!

更严肃地说,eufony/dbal 最初是作为 eufony/orm 的姐妹项目启动的,eufony/orm 是一个旨在用创新实用方法重新思考关系数据库模型劣势的 对象关系映射 库。在早期开发中得出结论,没有在SQL之上建立抽象层,支持多种SQL版本是不切实际的

因此,项目被分为两部分,其中 eufony/orm 提供顶层,而 eufony/dbal 提供底层,这与其他流行的项目如 Doctrine ORM 相似。然而,与 Doctrine 项目不同的是,eufony/dbal 还尝试为查询构建器创建一种表达性语法,因为它们是最终用户(您)可能会与之交互的内容。

入门

安装

eufony/dbalPackagist 包的形式发布,可以通过 Composer 简单安装:

composer require "eufony/dbal:v1.x-dev"

警告:此包目前还没有任何稳定版本(甚至没有 v0.x 预发布版)并且目前是 不稳定 的。请预期会频繁出现破坏性变更和不稳定性!

基本用法

有关更详细的文档,请参阅此处

eufony/dbal 是一个“零配置”库,让您快速开始。只需定义一个新的数据库连接(可选)并给它一个名称,如下所示

$driver = /* ... */;
$database = new Connection($driver, key: "default");

驱动可以是任何驱动接口的实现。开箱即用,eufony/dbal 支持 PostgreSQL、MySQL 和 SQLite

// PostgreSQL
$postgres = new PostgreSQLDriver($dsn, $user, $password);

// MySQL
$mysql = new MySQLDriver($dsn, $user, $password);

// SQLite
$sqlite = new SQLiteDriver($path); // $path can also be `:memory:` for an ephemeral database

所有三个驱动程序都在底层使用 PHP PDO 扩展。

一旦您的连接被激活,您就可以立即开始构建并发送查询到数据库

// Define the query
$query = Select::from("users");

// You can also extend the query using loops, conditional logic, etc.
if ($fetch_ids_only) {
    $query = $query->fields(["id"]);
}

// Generate the query string and send it to the database for execution
$users = $query->execute();

您可以在此处找到查询示例列表。

贡献

发现了错误或缺失的功能?在 问题跟踪器 中报告。

许可协议

本程序是自由软件:您可以按照自由软件基金会发布的 GNU 较小通用公共许可证的条款重新分发和/或修改它,许可证版本为 3 或(根据您的选择)任何后续版本。

本程序的分发是出于希望它能对您有用,但没有任何保证;甚至没有关于适销性或特定用途的暗示保证。有关详细信息,请参阅 GNU 较小通用公共许可证。

您应该已经收到了与该程序一起的GNU通用公共许可协议的副本。如果没有,请参阅https://gnu.ac.cn/licenses/