mfn/cakephp2-postgres-no-meta

一个不支持 getColumnMeta() 的 CakePHP2 Postgres 数据库驱动

0.0.6 2020-03-25 06:19 UTC

This package is auto-updated.

Last update: 2024-08-25 15:56:02 UTC


README

该驱动程序在以下方面进行了更改

  1. CakePHP 2.x 默认的 Postgres 驱动程序使用 getColumnMeta 从服务器推断列类型。尽管近年来在 PHP 部分进行了优化 [1],但每次调用查询如 SELECT RELNAME FROM PG_CLASS WHERE OID=... [2] 时仍会产生开销。

因此,产生了这个实现,它放弃了任何元数据的使用,而只是使用 PDO::FETCH_ASSOC

  1. 存在一个问题,即包含实际不是 CakePHP 特有的 \ 字符的特殊定制的 SQL 语句 [3],这是一个底层的 PDO/PgSQL 驱动程序的问题 [4]。

已覆盖 \Postgres::value() 方法,以对字符串应用特殊的 C 风格转义操作 [5]。

  1. 默认的 PHP/PDO lastInsertId 总是返回一个字符串。此驱动程序已调整为在 is_numeric 返回 true 时返回整数。这允许更容易地与使用 strict_types=1 的代码库集成。

需求和安装

  1. 您需要至少 CakePHP 2.10.12
    对于 CakePHP >= 2.0 且 < 2.10.12,您可以使用此包的 0.0.2 版本
  2. 将以下行添加到您的 app/composer.json 中: "mfn/cakephp2-postgres-no-meta": "^0.0.6"
  3. 运行 php composer.phar require mfn/cakephp2-postgres-no-meta
  4. app/Config/bootstrap.php 中加载插件: PostgresNoMeta.Database/PostgresNoMeta(而不是 Database/Postgres
CakePlugin::load('PostgresNoMeta');
  1. 在您的 app/Config/database.php 中使用该驱动程序: PostgresNoMeta.Database/PostgresNoMeta(而不是 Database/Postgres
  2. 成功!

原因

在将大型应用程序从 MySQL 切换到 Postgres 的过程中,发现 Postgres 上丢失了大量的开销,最终发现这些元查询产生了可测量的开销。

单个查询非常快,但根据您的查询,它们可能会累积到可测量的程度。

在我们的情况下,激活此类后,性能提高了 50%,没有任何其他更改。YMMV。

稍后还发现了与生成的 SQL 语句的问题,这些语句在特殊情况下被转换为

INSERT INTO models(field) VALUES('\'':1');

在发送到服务器之前,导致各种问题。

INSERT INTO models(field) VALUES('\''$1');

进一步参考