ronpinkas / dbbridge
使用 PDO (本地和 ODBC) 驱动程序在多个 SQL 方言之间建立抽象桥。
Requires
- php: >=8.0
This package is auto-updated.
Last update: 2024-09-23 01:01:00 UTC
README
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:源数据库抽象器。
过程
-
检索列定义:getTableColums()通过调用本地函数fetchTableColumnDefinitions()检索源表的列定义。结果是包括列名、数据类型和is_nullable的列定义数组。可能还包括特定方言的列定义标签。
-
转换列定义:transformTableColumnDefs()用于将本地源方言特定的数据类型转换为相应的标准类型。这是通过调用{source-dialect}TypeTo_stdType()完成的。然后通过调用stdTypeTo_{target-dialect}()将标准类型转换为目标方言的数据类型。这导致了包括一个额外的original_type以及deduced pdo_type的扩展表列定义。
-
编译创建表查询:compileCreateTableQuery()使用transformTableColumnDefs()中收集的扩展目标定义信息来编译特定方言服务器的适当CREATE TABLE语句。它允许对表创建语句进行特定方言的定制。
-
编译选择查询:compileSelectQuery()编译SELECT语句以生成所需格式的命名源值。
-
编译插入查询: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的原版许可证。