fwolfsjaeger / doctrine-cockroachdb
Doctrine DBAL CockroachDB 驱动
Requires
- php: ^8.2
- ext-pdo: *
- ext-pdo_pgsql: *
- doctrine/dbal: ^4.0
Requires (Dev)
- doctrine/orm: ^3.0
- friendsofphp/php-cs-fixer: ^3.41
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-doctrine: ^1.3
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.5
- phpstan/phpstan-symfony: ^1.3
- phpunit/phpunit: ^10.1
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2024-09-11 18:39:49 UTC
README
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.json
中 post-install-cmd
和 post-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\AddDefaultToSerialGeneratorListener
和 DoctrineCockroachDB\ORM\Listener\RemoveDefaultFromForeignKeysListener
(按此顺序),以在使用 Doctrine ORM 时为标识符使用 SerialGenerator 获取适当的默认值。
故障排除
错误:currval():无法确定占位符 $1 的数据类型
这是由于使用 IdentityGenerator 作为 GenerateValue 策略以及 Doctrine ORM 的默认 BasicEntityPersister
。通过使用我们的自定义 BasicEntityPersister
和 SerialGenerator
来解决这个问题,具体操作请见上文。
单元测试
启动一个不安全的单节点实例
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";