参考了很多前人的文章,最后只支持Db::query原生查询,不支持thinkphp数据模型方法,这在实际项目中是很难接受的,特分享出解决方案。
先按照流程配置如下:
1.准备工作
首先确认PHP支持金仓数据库的扩展,可以去金仓官网下载,安装配置(详细配置略过……)。
使用 php -m 命令检查,显示有 pdo_kdb即可。 这里注意一下libpq.dll的版本要>=10,否则会报错误。
2,新增金仓数据库的connenter类
进到ThinkPHP项目目录下的vendortopthinkthink-ormsrcdbconnector下,复制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项目目录下的vendortopthinkthink-ormsrcdbbuilder下,复制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 =apphomemodelUser::select(); dump( $data ); } catch (Exception $e ) { dump( $e ->getMessage()); } apphomemodelUser::create([ "user_name" => "123456" , "user_pwd" => "123456" , "mobile" => "abc" , "full_name" => "abc" , ]);
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容