fwolfsjaeger/doctrine-cockroachdb

0.9.0 2024-04-11 17:51 UTC

README

Latest Stable Version Total Downloads PHP Version Require License

CockroachDB 驱动

CockroachDB 驱动是一个 Doctrine DBAL 驱动和 ORM 补丁,用于处理与 PostgreSQL 的不兼容性。

特别感谢

  • Lapay Group,他们的 CockroachDB Doctrine 驱动是本驱动的基础
  • media.monks,他们的想法是通过 composer 脚本修补 FQCN
  • sweoggy,他对使用 CockroachDB 内置 SERIAL 生成器的贡献

CockroachDB 快速设置指南

用法

配置

# doctrine.yaml
doctrine:
    dbal:
        user: <user>
        port: <port(26257)>
        host: <host>
        dbname: <dbname>
        sslmode: verify-full
        sslrootcert: <path-to-ca.crt>
        sslcert: <path-to-user.crt>
        sslkey: <path-to-user.key>
        driver: pdo_pgsql
        driver_class: DoctrineCockroachDB\Driver\CockroachDBDriver

(可选) 使用修改后的 BasicEntityPersister 和 SerialGenerator

为了提高兼容性和性能,我们建议您使用本包提供的自定义 BasicEntityPersister 覆盖 Doctrine ORM 的默认 BasicEntityPersister。当使用自定义 BasicEntityPersister 时,您可以使用 CockroachDB 内置的 SERIAL 生成器来处理主键,其性能远优于 Doctrine 推荐的 SequenceGenerator。

覆盖操作是通过将 composer 脚本 DoctrineCockroachDB\\Composer\\PatchDoctrine::overrideBasicEntityPersister 添加到 composer.jsonpost-install-cmdpost-update-cmd 脚本部分来完成的

{
    "scripts": {
        "post-install-cmd": [
            "DoctrineCockroachDB\\Composer\\PatchDoctrine::overrideBasicEntityPersister"
        ],
        "post-update-cmd": [
            "DoctrineCockroachDB\\Composer\\PatchDoctrine::overrideBasicEntityPersister"
        ]
    }
}

然后更改您的实体以使用本包提供的 SerialGenerator

<?php

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use DoctrineCockroachDB\ORM\Id\SerialGenerator;

#[Entity]
#[Table]
class Entity
{
    #[ORM\Id]
    #[ORM\GeneratedValue(strategy: 'CUSTOM')]
    #[ORM\CustomIdGenerator(class: SerialGenerator::class)]
    #[ORM\Column(name: 'id', type: Types::INTEGER, options: ['unsigned' => true])]
    private int $id;
}

最后,您应该注册 DoctrineCockroachDB\ORM\Listener\AddDefaultToSerialGeneratorListenerDoctrineCockroachDB\ORM\Listener\RemoveDefaultFromForeignKeysListener(按此顺序),以在使用 Doctrine ORM 时为标识符使用 SerialGenerator 获取适当的默认值。

故障排除

错误:currval():无法确定占位符 $1 的数据类型

这是由于使用 IdentityGenerator 作为 GenerateValue 策略以及 Doctrine ORM 的默认 BasicEntityPersister。通过使用我们的自定义 BasicEntityPersisterSerialGenerator 来解决这个问题,具体操作请见上文。

单元测试

启动一个不安全的单节点实例

cockroach start-single-node \
  --store='type=mem,size=1GB' \
  --log='sinks: {stderr: {channels: [DEV]}}' \
  --listen-addr=127.0.0.1:26257 \
  --insecure \
  --accept-sql-without-tls

连接到 CockroachDB

cockroach sql --host=127.0.0.1:26257 --insecure

为测试创建用户和数据库

CREATE USER "doctrine_tests";
CREATE DATABASE doctrine_tests OWNER "doctrine_tests";
USE doctrine_tests;
CREATE SCHEMA doctrine_tests AUTHORIZATION "doctrine_tests";
ALTER DATABASE doctrine_tests SET search_path = doctrine_tests;
GRANT ALL PRIVILEGES ON DATABASE doctrine_tests TO "doctrine_tests";
GRANT ALL PRIVILEGES ON SCHEMA doctrine_tests TO "doctrine_tests";
CREATE TABLE doctrine_tests.TestEntity (an_identifier SERIAL4 NOT NULL, second_identifier SERIAL4 NOT NULL, a_string_column VARCHAR(255) NOT NULL);
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA doctrine_tests TO "doctrine_tests";

许可证

MIT