学说自定义 MariaDB 平台

Posted

技术标签:

【中文标题】学说自定义 MariaDB 平台【英文标题】:Doctrine Custom MariaDB Platform 【发布时间】:2021-12-02 19:52:39 【问题描述】:

我已经创建了 CustomDbPlatform 扩展 mysqlPlatform 基于现有 MariaDb1027Platform 使用自定义 getDefaultValueDeclarationSQL 方法。我不能扩展MariaDbPlatform,因为它是最后一课。

class CustomDbPlatform extends MySqlPlatform

    public function getJsonTypeDeclarationSQL(array $column): string
    
        return 'LONGTEXT';
    

    protected function getReservedKeywordsClass(): string
    
        return MariaDb102Keywords::class;
    

    protected function initializeDoctrineTypeMappings(): void
    
        parent::initializeDoctrineTypeMappings();

        $this->doctrineTypeMapping['json'] = Types::JSON;
    

    public function getDefaultValueDeclarationSQL($column): string
    
        if (isset($column['default'], $column['type'])) 
            $default = $column['default'];
            $type = $column['type'];

            if ($type instanceof DateTimePrecisionType && stripos($default, $this->getCurrentTimestampSQL()) !== false) 
                if (isset($column['length']) && $column['length'] > 0 && $column['length'] < 255) 
                    return ' DEFAULT ' . sprintf('%s(%d)', $this->getCurrentTimestampSQL(), $column['length']);

                

                return ' DEFAULT ' . $this->getCurrentTimestampSQL();
            
        

        return parent::getDefaultValueDeclarationSQL($column);
    

不幸的是,在模式更新期间,Doctrine 强制使用新的表列定义基本上更新整个模式。这个问题是由MySqlSchemaManager 引起的,它专门检查MariaDb1027Platform

if ($this->_platform instanceof MariaDb1027Platform) 
        $columnDefault = $this->getMariaDb1027ColumnDefault($this->_platform, $tableColumn['default']);
     else 
        $columnDefault = $tableColumn['default'];
    

如何让 Doctrine 将我的 CustomDbPlatform 识别为 MariaDb1027Platform?制作自定义 SchemaManager 似乎有点过头了。

使用

Symfony 4.4 教义2 MariaDB 10.3

【问题讨论】:

会扩展MySqlSchemaManager 并仅覆盖_getPortableTableColumnDefinition 方法吗?也许不那么矫枉过正,但似乎其他任何事情都需要从 Doctrine 库中进行更改 【参考方案1】:

如果你想扩展MariaDb1027Platform,唯一的办法是:

    从https://github.com/doctrine/dbal/blob/3.1.x/src/Platforms/MariaDb1027Platform.php复制平台类文件, 地点在您的项目中 删除final kw 在从 DBAL 库自动加载类之前加载此文件 - 您可以使用 composer autoload files 部分

另外,我创建了 PR https://github.com/doctrine/dbal/pull/4909 看看维护者是否想正式支持这个。

【讨论】:

@filip-kaszczyński 请标记为答案

以上是关于学说自定义 MariaDB 平台的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义连接器正确终止 Django 中的 MySQL/MariaDB 连接

HAPROXY实战案例:https反向代理的实现TCP四层反向代理MariaDB及自定义错误页面

CentOS 6 自定义单实例 二进制方式 安装mariadb-5.5.59

如何将自定义属性添加到 Symfony Doctrine YAML 映射文件

微信公众平台官方自定义菜单url 网页授权

PHP玩转微信公众平台自定义接口