`

TP5 连接 postgres 问题

 
阅读更多

问题一: 配置修改为pgsql,提示could not find driver

1. tp5 下

database  配置

    'DB_TYPE' => 'pgsql',

 

2.  打开php扩展 - 》 开启php_pgsql.dll , php_pdo_pgsql.dll

   在 wampserver xampp下PHP使用PDO 支持postgresql

http://blog.csdn.net/yageeart/article/details/6674296

 

问题二:  tp报错:

     错误: 函数 table_msg(unknown) 不存在 LINE 1: ...fault as "default",fields_default as "extra" from table_msg(... ^ HINT: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.

 

      3. tp3.2 版本的bug  --->查看 http://www.thinkphp.cn/bug/3413.html

修改 ThinkPHP\Library\Think\Db\Driver\Pgsql.class.PHP  里的 getFields()  方法,通过转义符把单引号添加

修改为:

$result =   $this->query('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.'\');');

 

    4. 为postgresql添加 函数 table_msg    --> http://lovejuan1314.iteye.com/blog/1167680

postgresql的sql管理器执行 如下代码(代码在tp5的\thinkphp\library\think\db\connector\pgsql.sql)目录

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 '获得表信息';

 

然后就可以了

 

 

3. postgresql  里 user 为关键字 ,若有数据表 名字为user

在tp中

要 查询此表时  ,可以 如:$user = Db::name("\"user\"")->select(); 需要转义

也可以在  设置usermodel 的真实表名,喏~

 

namespace app\remote\model;
use think\Db;
use think\Model;

class User extends Model{
    // 数据表名称
    protected $table = "\"user\"";
/*    public static function te(){
        $user = Db::name("\"user\"")->select();

        return $user;
    }*/
}

 

 

 

 

 

分享到:
评论

相关推荐

    CodeSmith8.0.1 连接postgres报错问题解决

    描述中的解决方案指出,将解压后的文件移动到"\SchemaProviders"文件夹可以修复连接问题。这表明问题可能源于CodeSmith在尝试访问或使用特定的PostgreSQL相关的库或组件时出现了故障。解压的文件包括Npgsql.dll、...

    postgressql连接数据库

    postgressql 连接数据库 和关闭数据库

    jmeter连接postgres数据库的样例

    jmeter连接postgres数据库的样例

    C#如何连接postgres数据库.rar

    3. C#如何连接postgres数据库.txt:这应该是一个文本文件,详细说明了C#连接PostgreSQL数据库的具体步骤和代码示例。 连接PostgreSQL数据库的基本步骤如下: 1. 引用必要的库:在C#项目中,需要添加对Npgsql或...

    postgres-42.2.5 jar包

    在实际项目中,使用postgres-42.2.5.jar可能涉及到数据库连接池的配置,例如使用HikariCP或C3P0,以提高性能和管理多个并发连接。此外,为了保证数据安全,还需要考虑使用预编译的SQL语句(PreparedStatement)防止...

    使用Druid数据连接池连接PostgreSQL简单例子

    同时,Druid还集成了监控、日志、SQL解析等功能,方便开发者进行性能调优和问题排查。 要连接到PostgreSQL数据库,我们需要以下步骤: 1. **添加依赖**:在项目的`pom.xml`文件中,添加Druid和PostgreSQL的JDBC...

    sqoop连接Postgres SQL 的驱动包

    利用sqoop导出PostgresSQL的数据时所需的驱动包,只需要将该包放到hive或sqoop的lib目录下即可。

    sqoop连接Postgres SQL 的驱动包postgresql-9.3-1102-jdbc41.jar

    sqoop连接Postgres SQL 的驱动包postgresql-9.3-1102-jdbc41.jar。 利用sqoop导出PostgresSQL的数据时所需的驱动包,只需要将该包放到hive或sqoop的lib目录下即可。

    PowerDesigner16.5+PostgresSQL

    PowerDesigner16.5+PostgresSQL

    node-pg-pool, node postgres的连接池.zip

    node-pg-pool, node postgres的连接池 pg池 节点postgres的连接池安装npm i pg-pool pg使用创建要使用pg池,你必须首先创建池的实例var Pool = require('pg-pool')// by default

    bat调用postgres的函数

    bat调用postgres的函数

    postgres sql 数据库连接工具

    postgres sql 数据库连接工具

    Postgres7.3和Kingbase命令及调用参考

    这个示例程序展示了如何使用 libpq 库来连接 Postgres 7.3 数据库,并执行一个简单的 SQL 查询命令。 三、Kingbase 命令及调用参考 Kingbase 是一个功能强大的关系数据库管理系统,提供了丰富的命令和调用接口。...

    postgres 主从

    根据题目提供的信息,“Linux下关于的postgres 主从 配置文档配置好了后,启动这台模拟宕掉的原主机,并使之与连接,并做他的备机”,主要涉及的是如何在Linux环境下配置PostgreSQL的主从架构,并在主数据库故障恢复...

    postgres数据库用户手册

    PostgreSQL,通常称为postgres,是一种强大的开源关系型数据库管理系统(RDBMS),在全球范围内被广泛应用于各种规模的应用程序。这份“postgres数据库用户手册”提供了一套详尽的指南,涵盖了从初学者到高级开发...

    postgres odbc x64

    【Postgres ODBC x64】是针对Windows 64位操作系统的PostgreSQL数据库系统的一个重要组件,它允许用户通过ODBC(Open Database Connectivity)接口与PostgreSQL进行数据交互。ODBC是一种标准的API,使得应用程序能够...

    postgres用户下ssh无密码登录

    ssh -vv postgres@node2 七、SELinux配置 在某些系统中,需要配置SELinux以允许无密码登录。可以使用以下命令禁用SELinux: SELINUX=disabled 并重启服务器: reboot 八、结论 本文详细介绍了Postgres用户下...

    postgres_exporter-0.9.0.linux-amd64.tar.gz

    5. Prometheus配置中添加Postgres Exporter作为目标,设置拉取间隔。 使用Postgres Exporter时,可以自定义监控项,例如: - `pg_stat_database`: 显示每个数据库的统计信息,如连接数、缓存命中率等。 - `pg_stat_...

    IDEA连接postgressql数据库操作

    username: postgres password: 0000 driverClassName: org.postgresql.Driver ``` 这里,URL指向了PostgreSQL服务器,用户名和密码用于认证,`driverClassName`指定了PostgreSQL的JDBC驱动类名。 2. 创建测试类...

Global site tag (gtag.js) - Google Analytics