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);
}


420

被折叠的 条评论
为什么被折叠?



