TP5兼容达梦国产数据库

1.首先数据库安装,部署时需配置大小写不敏感
2.安装PHP达梦扩展,一定要是对应版本(兼容操作系统)的扩展,否则会出现各种报错。参考官方文档:https://eco.dameng.com/document/dm/zh-cn/app-dev/php_php_new.html,注意拷贝扩展时根据安装的php版本,拷贝对应的线程安全或非安全版本扩展。
3.进入框架兼容改造部分,Config/database.php配置:
'type'            => 'dm', 
'quote'           => '"', //库名(模式名)引用符号" 或 ` 等
4.添加对应驱动文件:thinkphp/library/think/db/connector/Dm.php 和 thinkphp/library/think/db/builder/Dm.php,具体代码看项目

thinkphp/library/think/db/connector/Dm.php:

<?php
// +----------------------------------------------------------------------
// | Modified for Dameng Database
// +----------------------------------------------------------------------

namespace think\db\connector;

use PDO;
use think\Container;
use think\db\Connection;
use think\db\Query;

/**
 * 达梦数据库驱动
 */
class Dm extends Connection
{
    protected $builder = '\\think\\db\\builder\\Dm'; // 使用达梦的 SQL 构造器

    /**
     * 初始化
     * @access protected
     * @return void
     */
    protected function initialize()
    {
        // 可以在这里扩展达梦数据库特有的功能
    }

    /**
     * 解析pdo连接的dsn信息
     * @access protected
     * @param  array $config 连接信息
     * @return string
     */
    protected function parseDsn($config)
    {
        $dsn = 'dm:host=' . $config['hostname'] . ';port=' . $config['hostport'] . ';schema="' . $config['database'] . '"';

        if (!empty($config['charset'])) {
            $dsn .= ';charset=' . $config['charset'];
        }

        return $dsn;
    }

    /**
     * 取得数据表的字段信息
     * @access public
     * @param  string $tableName
     * @return array
     */
    public function getFields($tableName)
    {
        list($tableName) = explode(' ', $tableName);

        if (strpos($tableName, '.')) {
            list($schema, $tableName) = explode('.', $tableName);
        }

        // 达梦数据库获取表结构
        $sql    = "SELECT COLUMN_NAME, DATA_TYPE,DATA_DEFAULT, DATA_LENGTH, NULLABLE
            FROM DBA_TAB_COLUMNS
            WHERE TABLE_NAME = '{$tableName}'";
        $pdo    = $this->query($sql, [], false, true);
        $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
        $info   = [];

        if ($result) {
            foreach ($result as $key => $val) {
                $val                 = array_change_key_case($val);
                $info[$val['column_name']] = [
                    'name'    => $val['column_name'],
                    'type'    => $val['data_type'],
                    'notnull' => 'N' == $val['nullable'],
                    'default' => $val['data_default'],
                    'primary' => $val['column_name'] == 'id', //表主键基本都是id,为方便获取信息省略查询
                    'autoinc' => $val['column_name'] == 'id', //表自增字段基本都是id,为方便获取信息省略查询
                ];
            }
        }

        /*
         * 查询主键及自增示例
         * -- 获取主键字段
        SELECT
            c.COLUMN_NAME AS pk
        FROM
            DBA_CONSTRAINTS con
        JOIN
            DBA_CONS_COLUMNS c ON con.CONSTRAINT_NAME = c.CONSTRAINT_NAME
        WHERE
            con.TABLE_NAME = 'ss_logs_select'
            AND con.OWNER = 'self-service'
            AND con.CONSTRAINT_TYPE = 'P';

        -- 检查字段是否为自增字段
        select b.table_name,a.name COL_NAME from  SYS.SYSCOLUMNS a,all_tables b,sys.sysobjects c where a.INFO2 & 0x01 = 0x01
        and a.id=c.id and c.name= b.table_name AND b.table_name='ss_logs'
         * */

        return $this->fieldCase($info);
    }

    /**
     * 取得数据库的表信息
     * @access public
     * @param  string $dbName
     * @return array
     */
    public function getTables($dbName = '')
    {
        // 达梦数据库使用 SHOW TABLES 语句获取表信息
        $sql    = !empty($dbName) ? "SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = '" . $dbName . "'" : 'SELECT TABLE_NAME FROM DBA_TABLES';
        $pdo    = $this->query($sql, [], false, true);
        $result = $pdo->fetchAll(PDO::FETCH_ASSOC);
        $info   = [];

        foreach ($result as $key => $val) {
            $info[$key] = current($val);
        }

        return $info;
    }

    /**
     * 获取数据表信息
     * @access public
     * @param  mixed  $tableName 数据表名 留空自动获取
     * @param  string $fetch     获取信息类型 包括 fields type bind pk
     * @return mixed
     */
    public function getTableInfo($tableName, $fetch = '')
    {
        if (is_array($tableName)) {
            $tableName = key($tableName) ?: current($tableName);
        }

        if (strpos($tableName, ',')) {
            // 多表不获取字段信息
            return false;
        } else {
            $tableName = $this->parseSqlTable($tableName);
        }

        // 修正子查询作为表名的问题
        if (strpos($tableName, ')')) {
            return [];
        }

        list($tableName) = explode(' ', $tableName);

        if (false === strpos($tableName, '.')) {
            $schema = $this->getConfig('database') . '.' . $tableName;
        } else {
            $schema = $tableName;
        }

        if (!isset(self::$info[$schema])) {
            // 读取缓存
            $cacheFile = Container::get('app')->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR . $schema . '.php';

            if (!$this->config['debug'] && is_file($cacheFile)) {
                $info = include $cacheFile;
            } else {
                $info = $this->getFields($tableName);
            }

          
内容概要:本文档详细介绍了达梦数据库DM8与PHP-PDO扩展的集成方法,涵盖从环境搭建、驱动编译、配置详解到实际应用案例的全过程。首先,文档解析了DM8的系统架构和技术特性,重点介绍了其支持的两种存储引擎(堆表和聚簇表),并阐述了PDO_DM驱动的工作原理及其与DM8的通信机制。接着,文档详细描述了PHP环境的配置要求,包括操作系统、DM8数据库、PHP版本及Visual C++ Redist的要求,以及驱动文件的获取与验证步骤。此外,还深入探讨了PDO连接配置、高级连接选项(如SSL配置)、连接状态监测与故障转移等技术细节。文档进一步讲解了PDO核心操作,包括CRUD操作、达梦特有功能(如序列、分区表、全文索引)的集成,以及高级数据类型(如BLOB/CLOB、JSON、空间数据)的处理方法。在事务管理和并发控制方面,文档介绍了事务的基础操作、隔离级别设置、锁机制与并发控制,以及分布式事务处理。性能优化部分涵盖了SQL优化、批量操作优化、存储过程与函数调用等内容。最后,文档通过实际应用案例展示了企业级应用架构设计、高并发处理方案(如读写分离、缓存集成)、数据迁移与同步的方法,以及故障诊断与性能调优的具体实践。 适用人群:具备一定PHP编程基础,熟悉数据库操作,尤其是希望将PHP应用与达梦数据库DM8集成的研发人员和技术团队。 使用场景及目标:①了解达梦数据库DM8的技术架构及其与PHP-PDO扩展的集成方法;②掌握PHP环境配置、驱动编译与验证的步骤;③实现高效稳定的PHP-PDO连接配置,包括SSL加密、连接池优化等;④掌握CRUD操作、高级数据类型处理及达梦特有功能的集成;⑤理解和应用事务管理、并发控制及分布式事务处理;⑥优化SQL查询性能,提升批量操作效率,调用存储过程与函数;⑦设计高并发处理方案,实施数据迁移与同步;⑧进行故障诊断与性能调优,确保系统的稳定性和高效性。 其他说明:本文档不仅提供了详细的理论知识和技术背景,还包含大量实用的操作步骤和代码示例,帮助读者快速上手并解决实际问题。文档内容详尽,适合从初学者到有一定经验的技术人员参考使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值