ronpinkas/dbbridge

使用 PDO (本地和 ODBC) 驱动程序在多个 SQL 方言之间建立抽象桥。

v0.8.0 2023-06-12 23:14 UTC

This package is auto-updated.

Last update: 2024-09-23 01:01:00 UTC


README

Version License: MIT

dbBridge 是一个 'SQL 迁移工具' - 允许使用三行 PHP 代码将任何受支持的方言(MsSql, MySql, Oracle, PostgreSQL, Sqlite)的 SQL 数据库导入到这些受支持的方言中。

先决条件

  • PHP >= 8.0

安装

使用 Composer

如果您使用 Composer,可以通过运行以下命令将 dbBridge 添加到您的项目中:

composer require ronpinkas/dbbridge

手动安装

如果您不希望使用 Composer,您可以手动下载库并将其包含在项目中。

require_once 'path-to-dbBridge/dbAbstractor.php';

使用方法

dbAbstractor 类是 dbBridge 库的核心,它简化了在不同 SQL 方言之间传输数据库数据的过程。

require_once 'vendor/autoload.php';

use dbBridge\dbAbstractor;

// Example of setting PDO connection for source database
$pdoMsSql = new PDO("dblib:host=your_hostname;dbname=your_db;charset=utf8", "your_username", "your_password");

// Example of setting PDO connection for target database
$pdoMySql = new PDO("mysql:host=your_hostname;dbname=your_db;charset=utf8", "your_username", "your_password");

// Create dbBridge wrapper instances for the source and target databases
$dbSource = new dbAbstractor($pdoMsSql, 'YourDB-Name');
$dbTarget = new dbAbstractor($pdoMySql);

// Import the database
$dbTarget->importDb($dbSource);

已知限制

这个库是一个教育性的概念原型,具有以下已知限制:

不支持存储过程。不支持触发器。不支持索引。不支持约束。不支持序列。不支持外键。不支持视图。不支持函数。不支持用户定义类型。不支持用户定义聚合。

贡献

欢迎贡献!请随时提交拉取请求或创建问题,以改善任何您认为可以改进的地方。

许可证

本项目采用 MIT 许可证。有关详细信息,请参阅 LICENSE 文件。

联系方式

作者:Ron[ny] Pinkas 邮箱: ron@ronpinkas.com 网站: https://github.com/ronpinkas/dbBridge

致谢

  • 特别感谢 https://www.omie.com.br 对本研究时间的支持,这有助于本项目的开发。

  • 感谢 OpenAI 的 GPT 模型在 PHP 文档和代码示例、以及生成与 Composer 一起分发的文档方面的帮助和建议。

感谢社区的支持!

log_dbBridge 函数

dbBridge 库中的 log_dbBridge 函数负责记录和显示数据库导入过程中的进度和日志消息。它接受两个参数,一个消息字符串和一个上下文标志,用于确定消息的类型。

以下是 log_dbBridge 函数通常的用法示例

log_dbBridge("This is a transformation message", debugFlags::DEBUG_TRANSFORM_ALL );

在这个例子中,消息 "This is a transformation message" 与 DEBUG_TRANSFORM_ALL 标志相关联。此消息是否记录或显示取决于 debugFlags::$debugLogFlags 和 debugFlags::$debugShowFlags 中的位掩码设置。

您可以通过这种方式控制位掩码设置

// To enable logging of transformation messages
debugFlags::$debugLogFlags |= debugFlags::DEBUG_TRANSFORM_ALL;

// To enable displaying of transformation messages
debugFlags::$debugShowFlags |= debugFlags::DEBUG_TRANSFORM_ALL;

// To disable logging of transformation messages
debugFlags::$debugLogFlags &= ~debugFlags::DEBUG_TRANSFORM_ALL;

// To disable displaying of transformation messages
debugFlags::$debugShowFlags &= ~debugFlags::DEBUG_TRANSFORM_ALL;

这为您提供了控制基于其上下文记录或显示哪些消息的灵活性。

调试标志

debugFlags 类包含可以用于控制 log_dbBridge() 函数行为的常量。这些常量可以作为位掩码使用,通过类的 ::$debugLogFlags 和 ::$debugShowFlags 静态属性指定日志和显示消息的调试级别,这些属性可以通过 ::setDebugLogFlags() 和 ::setDebugShowFlags() 静态方法设置。

以下是每个标志的说明

DEBUG_ALWAYS (1):表示无论 debugFlags::$debugLogFlags 和 debugFlags::$debugShowFlags 中指定的掩码级别如何,消息都应该始终记录和显示。

DEBUG_TRANSFORM_RESERVED (4):指示应记录或显示关于将保留名称用作列名并导致添加'_'前缀的警告。

DEBUG_TRANSFORM_SOURCE (8):指示在转换中应记录或显示源数据。

DEBUG_TRANSFORM_TARGET (16):指示在转换中应记录或显示目标数据。

DEBUG_TRANSFORM_TRANSFORMED (32):指示应记录或显示转换后的数据。

DEBUG_TRANSFORM_ALL (60):所有转换相关标志的组合(DEBUG_TRANSFORM_RESERVED、DEBUG_TRANSFORM_SOURCE、DEBUG_TRANSFORM_TARGET、DEBUG_TRANSFORM_TRANSFORMED)。使用此标志记录或显示任何转换相关消息。

DEBUG_QUERY_CREATE (64):指示应记录或显示与查询创建相关的消息。

DEBUG_QUERY_SELECT (128):指示应记录或显示与SELECT查询相关的消息。

DEBUG_QUERY_INSERT (256):指示应记录或显示与INSERT查询相关的消息。

DEBUG_QUERY_ALL (448):所有查询相关标志的组合(DEBUG_QUERY_CREATE、DEBUG_QUERY_SELECT、DEBUG_QUERY_INSERT)。使用此标志记录或显示任何查询相关消息。

DEBUG_OVERWRITE (512):指示应记录或显示与数据覆盖相关的消息。

DEBUG_BIND (1024):指示应记录或显示与查询中数据绑定相关的消息。

DEBUG_EXECUTE (2048):指示应记录或显示与查询执行相关的消息。

DEBUG_FETCH (4096):指示应记录或显示与数据获取相关的消息。

DEBUG_FIXME (8192):指示应记录或显示与标记为修复或审查的项目相关的消息。

DEBUG_IMPORT_ROW (16384):指示应记录或显示与数据行导入相关的消息。

DEBUG_GC (32768):指示应记录或显示与垃圾回收相关的消息。

您可以通过使用按位或运算符组合这些标志来指定多个级别的消息。

importDb函数

importDb函数负责从给定源导入数据库。

参数

dbAbstractor $dbSource:源数据库抽象器。

过程

  1. 检索列定义:getTableColums()通过调用本地函数fetchTableColumnDefinitions()检索源表的列定义。结果是包括列名、数据类型和is_nullable的列定义数组。可能还包括特定方言的列定义标签。

  2. 转换列定义:transformTableColumnDefs()用于将本地源方言特定的数据类型转换为相应的标准类型。这是通过调用{source-dialect}TypeTo_stdType()完成的。然后通过调用stdTypeTo_{target-dialect}()将标准类型转换为目标方言的数据类型。这导致了包括一个额外的original_type以及deduced pdo_type的扩展表列定义。

  3. 编译创建表查询:compileCreateTableQuery()使用transformTableColumnDefs()中收集的扩展目标定义信息来编译特定方言服务器的适当CREATE TABLE语句。它允许对表创建语句进行特定方言的定制。

  4. 编译选择查询:compileSelectQuery()编译SELECT语句以生成所需格式的命名源值。

  5. 编译插入查询:compileInsertQuery()编译INSERT INTO语句,以便从源表检索的值可以正确地保存到目标表中。使用扩展列定义确定每个列的正确PDO参数类型。

常见问题解答

dbBridge库的目的是什么?

dbBridge库是一个用于使用PDO驱动程序在不同SQL方言之间传输数据库数据的PHP库。它特别适用于从一种SQL方言导入数据库到另一种SQL方言。

dbBridge支持哪些SQL方言?

截至当前版本,dbBridge支持与PHP的PDO驱动程序兼容的SQL方言,包括MySQL、MSSQL、Oracle、PostgreSQL和Sqlite,通过本地和/或ODBC驱动程序。该库的功能可能在将来扩展。

使用dbBridge导入数据库结构有何限制?

是的,dbBridge的当前版本有一些限制。它不支持导入存储过程、触发器、索引、约束、序列、外键、视图、函数、用户定义类型或用户定义聚合。(这位于待办事项列表中)

我可以在低于8.0版本的PHP中使用dbBridge吗?

dbBridge需要PHP 8.0或更高版本。建议使用最新稳定版本的PHP以确保兼容性和安全性。

我可以在没有Composer的情况下使用dbBridge吗?

是的,您可以通过下载并要求在脚本中包含dbAbstractor.php文件来手动将库包含到您的项目中。然而,建议使用Composer,因为它简化了安装过程。

我如何为dbBridge的开发做出贡献?

欢迎为dbBridge做出贡献!您可以在仓库中提交拉取请求或创建问题,以改进您认为可以改进的内容。

如果在使用dbBridge时遇到问题或错误,我该怎么做?

如果您遇到问题或错误,建议检查问题是否已知。如果尚未知道,您可以在仓库中创建一个问题,描述问题、重现步骤和任何错误消息。

我如何控制数据库导入过程中的日志记录和消息显示?

该库提供了log_dbBridge函数以及调试标志来控制导入过程中的日志记录和消息显示。您可以通过设置debugFlags::$debugLogFlags和debugFlags::$debugShowFlags的掩码设置来控制哪些消息被记录或显示。

dbBridge有支持或社区吗?

作为教育性的概念验证项目,dbBridge可能没有官方支持。然而,您可以通过联系作者或参与讨论并通过仓库进行贡献。

我可以在商业项目中使用dbBridge吗?

是的,dbBridge采用MIT许可证,允许在私人项目和商业项目中使用,只要包含dbBridge的原版许可证。