首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

ThinkPHP6支持金仓数据库(Kingbase)解决无法使用模型查询问题

编程知识
2024年08月01日 16:37

参考了很多前人的文章,最后只支持Db::query原生查询,不支持thinkphp数据模型方法,这在实际项目中是很难接受的,特分享出解决方案。

先按照流程配置如下:

1.准备工作

首先确认PHP支持金仓数据库的扩展,可以去金仓官网下载,安装配置(详细配置略过……)。

使用 php -m 命令检查,显示有 pdo_kdb即可。 这里注意一下libpq.dll的版本要>=10,否则会报错误。

2,新增金仓数据库的connenter类

进到ThinkPHP项目目录下的vendor\topthink\think-orm\src\db\connector\下,复制Pgsql.php为Kingbase.php(基于pgsql修改),修改文件中的类名为Kingbase。

/**
 * Kingbase数据库驱动
 */
class Kingbase extends PDOConnection

找到 protected function parseDsn(array $config): string 方法,修改该方法下代码:

$dsn = 'pgsql:dbname=' . $config['database'] . ';host=' . $config['hostname'];
//修改为:
$dsn = 'kdb:host=' . $config['hostname'] . ';dbname=' . $config['database'];

3.新增金仓数据库的builder类

进到ThinkPHP项目目录下的vendor\topthink\think-orm\src\db\builder\下,复制Pgsql.php为Kingbase.php,同样修改文件中的类名为Kingbase。

/**
 * Kingbase数据库驱动
 */
class Kingbase extends Builder

其他代码不需要修改。

 

4.ThinkPHP配置文件

三处mysql都修改为kingbase:

return [
    // 默认使用的数据库连接配置
    'default'         => env('database.driver', 'kingbase'),

……

// 数据库连接配置信息
    'connections'     => [
        'kingbase' => [
            // 数据库类型
            'type'            => env('database.type', 'kingbase'),
            // 服务器地址
            'hostname'        => env('database.hostname', 'localhost'),
            // 数据库名
            'database'        => env('database.database', 'TEST'),
            // 用户名
            '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', ''),

……

        // 更多的数据库配置信息
    ],
];

到此处,和其他文章介绍的方案都一样,现在介绍重点,重点就在这个执行的sql语句上,这个语句执行了很多次都不成功,不是提示table_msg函数不存在,就是其他的一些错误,后来在KStudio中单独创建各个函数,依次排除问题解决。
现在分享3个函数的创建语句,需要到对应的模式下,新建查询进行导入:

CREATE OR REPLACE FUNCTION public .pgsql_type(a_type   varchar )   RETURNS varchar AS
DECLARE
v_type   varchar ;
BEGIN
     IF a_type=  'int8' THEN
          v_type:=  'bigint' ;
     ELSIF a_type=  'int4' THEN
          v_type:=  'integer' ;
     ELSIF a_type=  'int2' THEN
          v_type:=  'smallint' ;
     ELSIF a_type=  'bpchar' THEN
          v_type:=  'char' ;
ELSE
          v_type:=a_type;
END IF;
RETURN v_type;
END

 

CREATE OR REPLACE FUNCTION public .table_msg(a_schema_name   varchar , a_table_name   varchar )   RETURNS SETOF tablestruct   AS
DECLARE
v_ret   public .tablestruct;

v_oid oid;

v_sql text;

v_rec RECORD;

v_key   varchar ;

BEGIN
    SELECT
    pg_class.oid   INTO v_oid
    FROM
    pg_class
INNER JOIN pg_namespace   ON
    (
        pg_class.relnamespace = pg_namespace.oid
            AND lower (pg_namespace.nspname) = a_schema_name
    )
    WHERE
    pg_class.relname = a_table_name;

IF   NOT FOUND   THEN
         RETURN ;
END IF;

v_sql =   '
     SELECT
           sys_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.adbin AS fields_default,
           sys_description.description AS fields_comment 
     FROM
           sys_attribute 
           INNER JOIN sys_class ON sys_attribute.attrelid = sys_class.oid 
           INNER JOIN sys_type ON sys_attribute.atttypid = sys_type.oid 
           LEFT OUTER JOIN sys_attrdef ON sys_attrdef.adrelid = sys_class.oid AND sys_attrdef.adnum = sys_attribute.attnum 
           LEFT OUTER JOIN sys_description ON sys_description.objoid = sys_class.oid AND sys_description.objsubid = sys_attribute.attnum
     WHERE
           sys_attribute.attnum > 0 
           AND attisdropped <> ATTISLOCAL 
ORDER BY sys_attribute.attnum' ;

FOR v_rec   IN EXECUTE v_sql LOOP
         v_ret.fields_name = v_rec.fields_name;

v_ret.fields_type = v_rec.fields_type;

IF v_rec.fields_length > 0   THEN
            v_ret.fields_length := v_rec.fields_length;
ELSE
            v_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   THEN
            v_ret.fields_key_name = v_key;
ELSE
            v_ret.fields_key_name =   '' ;
END IF;

RETURN NEXT v_ret;
END LOOP;

RETURN ;
END

  

CREATE OR REPLACE FUNCTION public .table_msg(a_table_name   varchar )   RETURNS SETOF tablestruct   AS
DECLARE
v_ret tablestruct;
BEGIN
FOR v_ret   IN SELECT *   FROM table_msg(  'public' ,a_table_name) LOOP
    RETURN NEXT v_ret;
END LOOP;
    RETURN ;
END

 

成功导入3个函数后,在函数项下会出现3个函数,如图:

 

在数据类型功能下,增加一个数据类型,数据类型配置如下:

 

 

完成此步骤后:可以在Controller控制器中执行如下代码测试:

 

try {
            $data =\app\home\model\User::select();
            dump(  $data );
        }  catch (\Exception   $e ) {
            dump(  $e ->getMessage());
        }


        \app\home\model\User::create([  "user_name" =>  "123456" ,
            "user_pwd" =>  "123456" ,
            "mobile" =>  "abc" ,
            "full_name" =>  "abc" ,
        ]);

  

 
From:https://www.cnblogs.com/lanfengye/p/18337128
本文地址: http://shuzixingkong.net/article/673
0评论
提交 加载更多评论
其他文章 为团队配置Linux环境,简单高效的项目共享方案
前言 最近好久没写博客了,事情太多了,我还搞了个新的好玩的项目,等后续做得差不多了来写篇文章介绍一下。 在我们目前的AI项目中,团队需要共同使用一台GPU服务器来做模型训练和数据处理。为了让每个团队成员都能高效地使用这台服务器,我们决定设置一个多用户共享环境。这样,无论是代码开发、模型测试还是结果验
比较基因组学流程
1、OrthoFinder 教程:用于比较基因组学的系统发育直系学推断 1.1 orthofinder介绍 OrthoFinder是一种快速、准确和全面的比较基因组学分析工具。它可以找到直系和正群,为所有的正群推断基因树,并为所分析的物种推断一个有根的物种树。OrthoFinder还为比较基因组分析
比较基因组学流程 比较基因组学流程 比较基因组学流程
SQL连续查询问题拓展—记上海拼多多非技术岗面试真题
真巧,昨天刚写了关于数据库连续问题的解决方案,没想到今天下午两点就有朋友在上海拼多多面试非技术岗位中就遇到了相似的问题。下面是原题: 一个最大连续支付失败的次数 有一张支付流水表pay;字段如下 id uid time status pay_01 1 2024-01-15 10:00:00 fail
[rCore学习笔记 020]第二章作业
写在前面 本随笔是非常菜的菜鸡写的。如有问题请及时提出。 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 编程题 实现一个裸机应用程序A,能打印调用栈 首先在这里卡了我很久的是调用栈保存在哪里,回想到上一部分画的
[rCore学习笔记 020]第二章作业 [rCore学习笔记 020]第二章作业 [rCore学习笔记 020]第二章作业
在Python中使用sqlalchemy来操作数据库的几个小总结
在探索使用 FastAPI, SQLAlchemy, Pydantic,Redis, JWT 构建的项目的时候,其中数据库访问采用SQLAlchemy,并采用异步方式。数据库操作和控制器操作,采用基类继承的方式减少重复代码,提高代码复用性。在这个过程中设计接口和测试的时候,对一些问题进行跟踪解决,并
Vue Hook 封装通用型表格
一、创建通用型表格的需求 实现一个通用型表格组件,具备以下功能: 动态列配置。 分页功能。 排序功能。 可扩展的行操作功能。 二、设计通用型表格组件 首先,需要设计一个基础的表格组件,它接受列配置、数据和分页信息等参数。 1. 创建 useTable Hook 在 src/hooks 目录下创建 u
Jenkins 配置即代码(Configuration as Code)详解
1、概述 在《Centos7下安装配置最新版本Jenkins(2.452.3)》这篇博文中讲解了如何安装Jenkins,虽然在安装Jenkins时安装了一些必备的推荐插件,但在企业环境中使用Jenkins之前,我们仍需完成一系列手动配置工作,如配置 System Configuration、Secu
Jenkins 配置即代码(Configuration as Code)详解 Jenkins 配置即代码(Configuration as Code)详解 Jenkins 配置即代码(Configuration as Code)详解
LangChain的LCEL和Runnable你搞懂了吗
LangChain的LCEL估计行业内的朋友都听过,但是LCEL里的RunnablePassthrough、RunnableParallel、RunnableBranch、RunnableLambda又是什么意思?什么场景下用?
LangChain的LCEL和Runnable你搞懂了吗 LangChain的LCEL和Runnable你搞懂了吗 LangChain的LCEL和Runnable你搞懂了吗