thinkphp6连接kingbase数据库

在/vendor/topthink/think-orm/src/db/connector中将Pgsql.php和pgsql.sql文件复制后改名为Kingbase.php和Kingbase.sql

Kingbase.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------namespace think\db\connector;use PDO;
use think\db\PDOConnection;/*** Kingbase数据库驱动*/
class Kingbase extends PDOConnection
{/*** 默认PDO连接参数* @var array*/protected $params = [PDO::ATTR_CASE              => PDO::CASE_NATURAL,PDO::ATTR_ERRMODE           => PDO::ERRMODE_EXCEPTION,PDO::ATTR_ORACLE_NULLS      => PDO::NULL_NATURAL,PDO::ATTR_STRINGIFY_FETCHES => false,];/*** 解析pdo连接的dsn信息* @access protected* @param  array $config 连接信息* @return string*/protected function parseDsn(array $config): string{$dsn = 'kdb:host=' . $config['hostname'] . ';dbname=' . $config['database'];if (!empty($config['hostport'])) {$dsn .= ';port=' . $config['hostport'];}return $dsn;}/*** 取得数据表的字段信息* @access public* @param  string $tableName* @return array*/public function getFields(string $tableName): array{[$tableName] = explode(' ', $tableName);// $sql         = 'select fields_name as "field",fields_type as "type",fields_not_null as "null",fields_key_name as "key",fields_default as "default",fields_default as "extra" from table_msg(\'' . $tableName . '\');';$sql    = 'SELECT a.attname AS "field", format_type(a.atttypid, a.atttypmod) AS "type", NOT a.attnotnull AS "null", COALESCE(conname, \'\') AS "key", pg_get_expr(adbin, adrelid) AS "default", \'\' AS "extra" FROM pg_class c JOIN pg_attribute a ON a.attrelid = c.oid LEFT JOIN (SELECT conname, conrelid, unnest(conkey) AS attnum FROM pg_constraint WHERE contype = \'p\') pk ON pk.conrelid = a.attrelid AND pk.attnum = a.attnum LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum WHERE c.relname = \'' . $tableName . '\'  AND a.attnum > 0 ORDER BY a.attnum;';$pdo    = $this->getPDOStatement($sql);$result = $pdo->fetchAll(PDO::FETCH_ASSOC);$info   = [];if (!empty($result)) {foreach ($result as $key => $val) {$val = array_change_key_case($val);$info[$val['field']] = ['name'    => $val['field'],'type'    => $val['type'],'notnull' => (bool) ('' !== $val['null']),'default' => $val['default'],'primary' => !empty($val['key']),'autoinc' => (0 === strpos($val['extra'], 'nextval(')),];}}return $this->fieldCase($info);}/*** 取得数据库的表信息* @access public* @param  string $dbName* @return array*/public function getTables(string $dbName = ''): array{$sql    = "select tablename as Tables_in_test from pg_tables where  schemaname ='public'";$pdo    = $this->getPDOStatement($sql);$result = $pdo->fetchAll(PDO::FETCH_ASSOC);$info   = [];foreach ($result as $key => $val) {$info[$key] = current($val);}return $info;}protected function supportSavepoint(): bool{return true;}
}

Kingbase.sql

CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varchar AS
DECLAREv_type varchar;
BEGINIF a_type='int8' THENv_type:='bigint';ELSIF a_type='int4' THENv_type:='integer';ELSIF a_type='int2' THENv_type:='smallint';ELSIF a_type='bpchar' THENv_type:='char';ELSEv_type:=a_type;END IF;RETURN v_type;
END;CREATE TYPE "public"."tablestruct" AS ("fields_key_name" varchar(100),"fields_name" VARCHAR(200),"fields_type" VARCHAR(20),"fields_length" BIGINT,"fields_not_null" VARCHAR(10),"fields_default" VARCHAR(500),"fields_comment" VARCHAR(1000)
);CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
DECLAREv_ret tablestruct;v_oid oid;v_sql varchar;v_rec RECORD;v_key varchar;
BEGINSELECTsys_class.oid  INTO v_oidFROMsys_classINNER JOIN sys_namespace ON (sys_class.relnamespace = sys_namespace.oid AND lower(sys_namespace.nspname) = a_schema_name)WHEREsys_class.relname=a_table_name;IF NOT FOUND THENRETURN;END IF;v_sql='SELECTsys_attribute.attname AS fields_name,sys_attribute.attnum AS fields_index,pgsql_type(sys_type.typname::varchar) AS fields_type,sys_attribute.atttypmod-4 as fields_length,CASE WHEN sys_attribute.attnotnull  THEN ''not null''ELSE ''''END AS fields_not_null,sys_attrdef.adsrc AS fields_default,sys_description.description AS fields_commentFROMsys_attributeINNER JOIN sys_class  ON sys_attribute.attrelid = sys_class.oidINNER JOIN sys_type   ON sys_attribute.atttypid = sys_type.oidLEFT OUTER JOIN sys_attrdef ON sys_attrdef.adrelid = sys_class.oid AND sys_attrdef.adnum = sys_attribute.attnumLEFT OUTER JOIN sys_description ON sys_description.objoid = sys_class.oid AND sys_description.objsubid = sys_attribute.attnumWHEREsys_attribute.attnum > 0AND attisdropped <> ''t''AND sys_class.oid = ' || v_oid || 'ORDER BY sys_attribute.attnum' ;FOR v_rec IN EXECUTE v_sql LOOPv_ret.fields_name=v_rec.fields_name;v_ret.fields_type=v_rec.fields_type;IF v_rec.fields_length > 0 THENv_ret.fields_length:=v_rec.fields_length;ELSEv_ret.fields_length:=NULL;END IF;v_ret.fields_not_null=v_rec.fields_not_null;v_ret.fields_default=v_rec.fields_default;v_ret.fields_comment=v_rec.fields_comment;SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema=a_schema_name AND table_name=a_table_name AND column_name=v_rec.fields_name;IF FOUND THENv_ret.fields_key_name=v_key;ELSEv_ret.fields_key_name='';END IF;RETURN NEXT v_ret;END LOOP;RETURN ;
END;COMMENT ON FUNCTION "public"."table_msg"(a_schema_name varchar, a_table_name varchar)
IS '获得表信息';---重载一个函数
CREATE OR REPLACE FUNCTION "public"."table_msg" (a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
DECLAREv_ret tablestruct;
BEGINFOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOPRETURN NEXT v_ret;END LOOP;RETURN;
END;COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar)
IS '获得表信息';

复制/vendor/topthink/think-orm/src/db/builder中的Pgsql.php改名为Kingbase.php

Kingbase.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);namespace think\db\builder;use think\db\Builder;
use think\db\Query;
use think\db\Raw;/*** Kingbase数据库驱动*/
class Kingbase extends Builder
{/*** INSERT SQL表达式* @var string*/protected $insertSql = 'INSERT INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%';/*** INSERT ALL SQL表达式* @var string*/protected $insertAllSql = 'INSERT INTO %TABLE% (%FIELD%) %DATA% %COMMENT%';/*** limit分析* @access protected* @param  Query     $query        查询对象* @param  mixed     $limit* @return string*/public function parseLimit(Query $query, string $limit): string{$limitStr = '';if (!empty($limit)) {$limit = explode(',', $limit);if (count($limit) > 1) {$limitStr .= ' LIMIT ' . $limit[1] . ' OFFSET ' . $limit[0] . ' ';} else {$limitStr .= ' LIMIT ' . $limit[0] . ' ';}}return $limitStr;}/*** 字段和表名处理* @access public* @param  Query     $query     查询对象* @param  mixed     $key       字段名* @param  bool      $strict   严格检测* @return string*/public function parseKey(Query $query, $key, bool $strict = false): string{if (is_int($key)) {return (string) $key;} elseif ($key instanceof Raw) {return $this->parseRaw($query, $key);}$key = trim($key);if (strpos($key, '->') && false === strpos($key, '(')) {// JSON字段支持[$field, $name] = explode('->', $key);$key            = '"' . $field . '"' . '->>\'' . $name . '\'';} elseif (strpos($key, '.')) {[$table, $key] = explode('.', $key, 2);$alias = $query->getOptions('alias');if ('__TABLE__' == $table) {$table = $query->getOptions('table');$table = is_array($table) ? array_shift($table) : $table;}if (isset($alias[$table])) {$table = $alias[$table];}if ('*' != $key && !preg_match('/[,\"\*\(\).\s]/', $key)) {$key = '"' . $key . '"';}}if (isset($table)) {$key = $table . '.' . $key;}return $key;}/*** 随机排序* @access protected* @param  Query     $query        查询对象* @return string*/protected function parseRand(Query $query): string{return 'RANDOM()';}}

config/database.php连接配置

<?phpreturn [// 默认使用的数据库连接配置'default'         => env('database.driver', 'kingbase'),// 自定义时间查询规则'time_query_rule' => [],// 自动写入时间戳字段// true为自动识别类型 false关闭// 字符串则明确指定时间字段类型 支持 int timestamp datetime date'auto_timestamp'  => true,// 时间字段取出后的默认时间格式'datetime_format' => 'Y-m-d H:i:s',// 时间字段配置 配置格式:create_time,update_time'datetime_field'  => '',// 自定义配置 - kingbase数据库配置模式'db_modal'        => 'ya_jz.',// 数据库连接配置信息'connections'     => ['kingbase' => [// 数据库类型'type'            => env('database.type', 'kingbase'),// 服务器地址'hostname'        => env('database.hostname', '192.168.1.16'),// 数据库名'database'        => env('database.database', 'testkingbase'),// 用户名'username'        => env('database.username', 'system'),// 密码'password'        => env('database.password', '123456'),// 端口'hostport'        => env('database.hostport', '54321'),// 数据库连接参数'params'          => [],// 数据库编码默认采用utf8'charset'         => env('database.charset', 'utf8'),// 数据库表前缀'prefix'          => env('database.prefix', 'ya_jz.tm_'), // 设置连接模式为ya_jz,默认public模式,不需要设置// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)'deploy'          => 0,// 数据库读写是否分离 主从式有效'rw_separate'     => false,// 读写分离后 主服务器数量'master_num'      => 1,// 指定从服务器序号'slave_no'        => '',// 是否严格检查字段是否存在'fields_strict'   => true,// 是否需要断线重连'break_reconnect' => false,// 监听SQL'trigger_sql'     => env('app_debug', false),// 开启字段缓存'fields_cache'    => false,],'mysql_2' => [// 数据库类型'type'            => env('mysql_2.type', 'mysql'),// 服务器地址'hostname'        => env('mysql_2.hostname', '192.168.1.66'),// 数据库名'database'        => env('mysql_2.database', 'mzjz01_xx'),// 用户名'username'        => env('mysql_2.username', 'mzt'),// 密码'password'        => env('mysql_2.password', 'mzt01'),// 端口'hostport'        => env('mysql_2.hostport', '3306'),// 数据库连接参数'params'          => [],// 数据库编码默认采用utf8'charset'         => env('mysql_2.charset', 'utf8'),// 数据库表前缀'prefix'          => env('mysql_2.prefix', 'tm_'),// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)'deploy'          => 0,// 数据库读写是否分离 主从式有效'rw_separate'     => false,// 读写分离后 主服务器数量'master_num'      => 1,// 指定从服务器序号'slave_no'        => '',// 是否严格检查字段是否存在'fields_strict'   => true,// 是否需要断线重连'break_reconnect' => false,// 监听SQL'trigger_sql'     => env('app_debug', false),// 开启字段缓存'fields_cache'    => false,],// 更多的数据库配置信息],
];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中EXPLAIN关键字详解

昨天领导突然问到&#xff0c;MySQL中explain获取到的type字段中index和ref的区别是什么。 这两种状态都是在使用索引后产生的&#xff0c;但具体区别却了解不多&#xff0c;只知道ref相比于index效率更高。 因此&#xff0c;本文较为详细地记录了MySQL性能中返回字段的含义、状…

使用Excel表格还是JSON数据来将数据存入Neo4的选择要素

在选择使用Excel表格还是JSON数据来将数据存入Neo4j时&#xff0c;需要考虑多个因素&#xff0c;包括数据的复杂性、规模、已有的数据处理工具以及你的个人或团队的熟悉度。以下是对两者的一些比较&#xff0c;帮助你做出选择&#xff1a; Excel表格 优点&#xff1a; 直观性…

Oracle(13)什么是外键(Foreign Key)?

外键&#xff08;Foreign Key&#xff09;是一个数据库表中的列或一组列&#xff0c;它们用于建立和强化两个表之间的链接和关系。外键指向另一个表的主键&#xff0c;用于确保数据的一致性和完整性。通过外键&#xff0c;可以保证一个表中的值必须来源于另一个表中的主键值。 …

【web】-反序列化-to_string

<?php highlight_file(__FILE__); class A{public $s;public function __destruct(){echo "hello".$this->s;}} class B{public $cmd;public function __toString(){system($this->cmd);return 1;} } unserialize($_GET[code]); __toString()当对象被当着…

探索特征的隐秘关系:在Scikit-Learn中进行特征交互性分析

探索特征的隐秘关系&#xff1a;在Scikit-Learn中进行特征交互性分析 在机器学习模型中&#xff0c;特征交互性分析是一种揭示特征之间相互作用对模型输出影响的技术。Scikit-Learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中广泛使用的机器学习库&#xff…

【Linux服务器Java环境搭建】013 springboot + vue 前后端分离项目详细介绍(理论)

系列文章目录 【Linux服务器Java环境搭建】_一起来学吧的博客-CSDN博客 前言 在之前系列文章Linux服务器Java环境搭建 中&#xff0c;已经在CentOS中将所有环境及所需组件都安装完成了&#xff0c;比如git、jdk、nodejs、maven、mysql、clickhouse、redis、Nginx、rabbitMQ等…

《梦醒蝶飞:释放Excel函数与公式的力量》17.1使用命名范围和工作表函数

第17章&#xff1a;使用命名范围和工作表函数 17.1 命名范围的优势 在Excel中&#xff0c;使用命名范围是一个强大且灵活的功能&#xff0c;它可以极大地提高工作效率和公式的可读性。命名范围不仅使公式更容易理解&#xff0c;还减少了错误的可能性。以下将详细介绍命名范围的…

C++ STL equal_range 用法

一&#xff1a;功能 用于查找元素&#xff0c;它返回了 lower_bound, upper_bound 这两个函数查找结果值。 1. lower_bound 是返回第一个大于等于查找元素的位置。 2. upper_bound 是返回第一个大于查找元素的位置 二&#xff1a;用法 #include <vector> #include &l…

C++案例三:猜数字游戏

文章目录 介绍代码说明设置随机种子生成随机数猜测循环完整代码运行效果介绍 猜数字游戏是一个经典的编程练习,通过这个案例可以学习到基本的输入输出、随机数生成、条件判断和循环结构。 代码说明 设置随机种子 std::srand(static_cast<unsigned int>(std::time(nu…

自然语言大模型介绍

1 简介 最近一直被大语言模型刷屏。本文是周末技术分享会的提纲&#xff0c;总结了一些自然语言模型相关的重要技术&#xff0c;以及各个主流公司的研究方向和进展&#xff0c;和大家共同学习。 2 Transformer 目前的大模型基本都是Transformer及其变种。本部分将介绍Transf…

24暑假算法刷题 | Day18 | LeetCode 530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先

目录 530. 二叉搜索树的最小绝对差题目描述题解 501. 二叉搜索树中的众数题目描述题解 236. 二叉树的最近公共祖先题目描述题解 530. 二叉搜索树的最小绝对差 点此跳转题目链接 题目描述 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差…

Python 更换 pip 源详细指南

目录 前言pip 国内源临时换源方法一&#xff1a;添加参数方法二&#xff1a;设置环境变量 永久换源方法三&#xff1a;修改配置方法四&#xff1a;pip 命令修改 总结 前言 在我们使用 Python 3 时&#xff0c;pip 是一个不可或缺的工具&#xff0c;它用于安装和管理第三方库。…

在虚拟机 CentOS7 环境下安装 MySQL5.7 数据库

配置目标 在虚拟机的 Linux CentOS7 环境下安装 MySQL5.7 版数据库&#xff0c;并能从宿主机 Windows 系统连接该数据库&#xff08;默认端口&#xff1a;3306&#xff09;。 1. 准备工作 WMware 虚拟机&#xff1a;VMware Workstation 16 ProCentOS7 镜像&#xff1a;CentO…

ubuntu 上安装软件

1.ubuntu 上安装火狐 在Ubuntu上安装Mozilla Firefox&#xff08;火狐浏览器&#xff09;通常很简单&#xff0c;你可以通过Ubuntu的软件包管理器来完成安装。以下是安装步骤&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 更新你的软件包列表&#xff0c;以确保你…

基于密钥的身份验证(Linux-Linux)

A主机&#xff1a; 1、生成密钥对 [rootservera ~]# ssh-keygen查看公钥 注&#xff1a;id_rsa为私钥&#xff08;证书&#xff09;&#xff0c;id_rsa.pub为公钥 2、注册公钥到服务器 [rootservera ~]# ssh-copy-id root172.25.250.106 查看.ssh 3、使用密钥连接服务器 #…

域名解析中断

在当今数字化的时代&#xff0c;网络已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;当域名解析中断时&#xff0c;整个网络世界仿佛瞬间陷入了混乱&#xff0c;给个人和企业带来诸多不便和损失。 域名解析&#xff0c;简单来说&#xff0c;就是将我们在浏览器中…

【yolov8】3、yolov8 环境安装 【GPU版】

pycharm下载安装 yolov8 环境安装 【GPU版】 1、要求1.1 什么是 CUDA 和 CUDNN1.2 查看cuda版本的3种方法&#xff08;版本在10.2以上的可以忽略本章节&#xff09;&#xff1a;1.3 没有找到NIVDIA图标&#xff0c;确认是否有英伟达显卡 2、pycharm下载安装进入官网 3、yolov8…

【Android】视图与常用控件总结

文章目录 一、视图基础1.1 设置视图的宽高1.2 设置视图的间距1.3 设置视图的对齐方式1.4 总结 二、控件2.1 TextView2.1.1 设置宽高2.1.2 设置内容2.1.3 设置大小2.1.4 设置颜色 2.2 Button2.3 EditText2.4 ImageView2.5 ProgressBar2.6 AlertDialog2.7 ProgressDialog 本文主要…

JAVASE进阶day14(网络编程续TCP,日志)

TCP 三次握手 四次挥手 package com.lu.day14.tcp;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) {try(Socket socket new Socket("192.…

哈默纳科HarmonicDrive减速机组装注意事项

在机械行业中&#xff0c;精密传动设备HarmonicDrive减速机对于维持机械运作的稳定性和高效性起着至关重要的作用。然而在减速机的组装过程中&#xff0c;任何一个细微的错误都可能导致其运转时出现振动、异响等不良现象&#xff0c;严重时甚至可能影响整机的性能。因此&#x…