mac-docker-php容器连接mac中的pgsql数据库失败以及出现table_msg存错误时的解决方法

本文主要是介绍mac-docker-php容器连接mac中的pgsql数据库失败以及出现table_msg存错误时的解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以php中的thinkphp 5.1为例,php容器连接mac中的pgsql数据库失败时,出现如下错误

[7] PDOException in Connection.php line 528
SQLSTATE[08006] [7] could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

解决:以thinkphp 5.1为例,只需把 database.php 中的 hostname 改为 host.docker.internal 即可,然后,thinkphp 就能访问到数据库了。

return [// 数据库类型'type'            => 'pgsql',// 服务器地址'hostname'        => 'host.docker.internal'
];

如果可以访问后,再出现 table_msg(unknown) 如下错误时

SQLSTATE[42883]: Undefined function: 7 ERROR: function table_msg(unknown) does not exist
LINE 1: ...fault as "default",fields_default as "extra" from table_msg(...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

解决:在数据库中执行如下sql即可(因为 table_msg 函数需要用户自己定义)

CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varchar AS  
$BODY$  
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;  
$BODY$  
LANGUAGE PLPGSQL;  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  
$body$  
DECLARE  v_ret tablestruct;  v_oid oid;  v_sql varchar;  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  pg_attribute.attname AS fields_name,  pg_attribute.attnum AS fields_index,  pgsql_type(pg_type.typname::varchar) AS fields_type,  pg_attribute.atttypmod-4 as fields_length,  CASE WHEN pg_attribute.attnotnull  THEN ''not null''  ELSE ''''  END AS fields_not_null,  pg_attrdef.adsrc AS fields_default,  pg_description.description AS fields_comment  FROM  pg_attribute  INNER JOIN pg_class  ON pg_attribute.attrelid = pg_class.oid  INNER JOIN pg_type   ON pg_attribute.atttypid = pg_type.oid  LEFT OUTER JOIN pg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum  LEFT OUTER JOIN pg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnum  WHERE  pg_attribute.attnum > 0  AND attisdropped <> ''t''  AND pg_class.oid = ' || v_oid || '  ORDER BY pg_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;  
$body$  
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;  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  
$body$  
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;  
$body$  
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;  COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar)  
IS '获得表信息'; 

这篇关于mac-docker-php容器连接mac中的pgsql数据库失败以及出现table_msg存错误时的解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763097

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个