mfn / cakephp2-postgres-no-meta
一个不支持 getColumnMeta() 的 CakePHP2 Postgres 数据库驱动
0.0.6
2020-03-25 06:19 UTC
Requires
- php: >=5.6
- composer/installers: *
README
该驱动程序在以下方面进行了更改
- CakePHP 2.x 默认的 Postgres 驱动程序使用
getColumnMeta
从服务器推断列类型。尽管近年来在 PHP 部分进行了优化 [1],但每次调用查询如SELECT RELNAME FROM PG_CLASS WHERE OID=...
[2] 时仍会产生开销。
因此,产生了这个实现,它放弃了任何元数据的使用,而只是使用 PDO::FETCH_ASSOC
。
- 存在一个问题,即包含实际不是 CakePHP 特有的
\
字符的特殊定制的 SQL 语句 [3],这是一个底层的 PDO/PgSQL 驱动程序的问题 [4]。
已覆盖 \Postgres::value()
方法,以对字符串应用特殊的 C 风格转义操作 [5]。
- 默认的 PHP/PDO
lastInsertId
总是返回一个字符串。此驱动程序已调整为在is_numeric
返回 true 时返回整数。这允许更容易地与使用strict_types=1
的代码库集成。
需求和安装
- 您需要至少 CakePHP 2.10.12
对于 CakePHP >= 2.0 且 < 2.10.12,您可以使用此包的0.0.2
版本 - 将以下行添加到您的
app/composer.json
中:"mfn/cakephp2-postgres-no-meta": "^0.0.6"
- 运行
php composer.phar require mfn/cakephp2-postgres-no-meta
- 在
app/Config/bootstrap.php
中加载插件:PostgresNoMeta.Database/PostgresNoMeta
(而不是Database/Postgres
)
CakePlugin::load('PostgresNoMeta');
- 在您的
app/Config/database.php
中使用该驱动程序:PostgresNoMeta.Database/PostgresNoMeta
(而不是Database/Postgres
) - 成功!
原因
在将大型应用程序从 MySQL 切换到 Postgres 的过程中,发现 Postgres 上丢失了大量的开销,最终发现这些元查询产生了可测量的开销。
单个查询非常快,但根据您的查询,它们可能会累积到可测量的程度。
在我们的情况下,激活此类后,性能提高了 50%,没有任何其他更改。YMMV。
稍后还发现了与生成的 SQL 语句的问题,这些语句在特殊情况下被转换为
INSERT INTO models(field) VALUES('\'':1');
在发送到服务器之前,导致各种问题。
INSERT INTO models(field) VALUES('\''$1');
。