laravel5.5 里面如果想要使用自定义的数据库连接器

由于项目里面使用到了doris,虽然doris支持mysql协议,但是如果直接把他当mysql使用是行不通的,因为doris并不支持mysql的一些option和mode设置,然后就会一直报错:

SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query (SQL: select sum(totalvisit) total_visit,hour time from `xxx` where `date` between 2023-12-05 and

追踪代码,一直查到

    public function createConnector(array $config){if (! isset($config['driver'])) {throw new InvalidArgumentException('A driver must be specified.');}if ($this->container->bound($key = "db.connector.{$config['driver']}")) {return $this->container->make($key);}switch ($config['driver']) {case 'mysql':return new MySqlConnector;case 'pgsql':return new PostgresConnector;case 'sqlite':return new SQLiteConnector;case 'sqlsrv':return new SqlServerConnector;}throw new InvalidArgumentException("Unsupported driver [{$config['driver']}]");}

因此需要写个Doris的连接器,因为和mysql连接器一样,只需要在connect方法里面去掉option即可。

<?phpnamespace App\Connectors;use Illuminate\Database\Connectors\MySqlConnector;class DorisConnector extends MySqlConnector
{public function connect(array $config){$dsn = $this->getDsn($config);// We need to grab the PDO options that should be used while making the brand// new connection instance. The PDO options control various aspects of the// connection's behavior, and some might be specified by the developers.$connection = $this->createConnection($dsn, $config, []);if (!empty($config['database'])) {$connection->exec("use `{$config['database']}`;");}$this->configureEncoding($connection, $config);// Next, we will check to see if a timezone has been specified in this config// and if it has we will issue a statement to modify the timezone with the// database. Setting this DB timezone is an optional configuration item.$this->configureTimezone($connection, $config);return $connection;}
}

注册了connector以后还是报错,具体报错位置如下:
也就是说还需要注册Connection因此还需要写个connection,并绑定。

protected function createConnection($driver, $connection, $database, $prefix = '', array $config = []){if ($resolver = Connection::getResolver($driver)) {return $resolver($connection, $database, $prefix, $config);}switch ($driver) {case 'mysql':return new MySqlConnection($connection, $database, $prefix, $config);case 'pgsql':return new PostgresConnection($connection, $database, $prefix, $config);case 'sqlite':return new SQLiteConnection($connection, $database, $prefix, $config);case 'sqlsrv':return new SqlServerConnection($connection, $database, $prefix, $config);}throw new InvalidArgumentException("Unsupported driver [$driver]");}
}

创建 DorisConnection 类时,你需要继承 Laravel 的 Illuminate\Database\MySqlConnection 类,并在类中添加 __construct 方法以及其他必要的方法,以处理与 “doris” 驱动相关的数据库连接逻辑。以下是一个简单的示例:

phpCopy code// app/Database/Connections/DorisConnection.phpnamespace App\Database\Connections;use Illuminate\Database\MySqlConnection;class DorisConnection extends MySqlConnection
{/*** Create a new database connection instance.** @param  \PDO|\Closure  $pdo* @param  string  $database* @param  string  $tablePrefix* @param  array  $config* @return void*/public function __construct($pdo, $database = '', $tablePrefix = '', array $config = []){parent::__construct($pdo, $database, $tablePrefix, $config);// 可以在这里添加额外的初始化逻辑}// 添加你需要的其他方法和逻辑...
}

在这个示例中,DorisConnection 类继承了 Laravel 的 MySqlConnection 类,并添加了一个构造方法,你可以在其中添加与 “doris” 驱动相关的初始化逻辑。这个类中的其他方法可以根据你的需求进行自定义。

确保这个类的命名空间和文件路径与你之前在 AppServiceProvider 中注册的一致。例如,如果你的 DorisConnection 类在 app/Database/Connections 目录下,那么命名空间应该是 App\Database\Connections

打开 app/Providers/AppServiceProvider.php 文件,确保你在 boot 方法中注册了 “doris” 驱动的连接解析器:


use Illuminate\Support\ServiceProvider;
use App\Database\Connectors\DorisConnector;class AppServiceProvider extends ServiceProvider
{/*** Bootstrap any application services.** @return void*/public function boot(){$this->app->bind('db.connector.doris', DorisConnector::class);// 手动指定连接解析器\Illuminate\Database\Connection::resolverFor('doris', function ($connection, $database, $prefix, $config) {return new \App\Database\Connections\DorisConnection($connection, $database, $prefix, $config);});}
}

最后,在使用的时候,在database.php里面还需要配置:

// config/database.php'connections' => [// ...'doris' => ['driver' => 'doris','host' => env('DB_DORIS_HOST', '127.0.0.1'),'port' => env('DB_DORIS_PORT', '3306'),'database' => env('DB_DORIS_DATABASE', 'forge'),'username' => env('DB_DORIS_USERNAME', 'forge'),'password' => env('DB_DORIS_PASSWORD', ''),// 其他配置项...],
],

在这里,我们使用 \Illuminate\Database\Connection::resolverFor 方法手动指定 “doris” 驱动的连接解析器,并创建了一个与之关联的自定义连接类 DorisConnection。确保 DorisConnection 类存在,并且包含了正确的连接逻辑。

这样,Laravel 就应该能够正确地识别和使用 “doris” 驱动了。如果问题仍然存在,请确保所有的文件名、类名、配置项等都没有拼写错误,并检查是否有其他配置文件或服务提供者干扰了连接的注册。

再次运行,可以链接了,执行sql成功,因此记录一下,给后来者铺路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端常用去重的几种方式

文章目录 方式1: ES6新语法方式2: 遍历 利用filter方式3: 使用 new Map() for循环方式4: 利用 hasOwnProperty总结 在github 查看该文章 方式1: ES6新语法 过滤出网页中不重复的html标签 结合去重知识点考查 […new Set([…document.querySelectorAll(‘*’)].map(v>v.t…

分布式锁,进程锁,线程锁

线程锁:大家都不陌生&#xff0c;主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时&#xff0c;那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时&#xff0c;同一时间只有一个线程在执行&#xff0c;其余线程必须要等…

Vue使用Canvas实现电子签名功能示例

当使用Vue来实现电子签名功能时&#xff0c;可以结合Canvas元素和Vue的数据绑定功能来实现。下面是一个简单的示例&#xff0c;演示了如何在Vue中使用Canvas实现电子签名功能&#xff1a; <template><div><!-- Canvas元素用于绘制电子签名 --><canvasref…

bigdecimal比较大小

bigdecimal比较大小 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在日常的Java开发中&#xff0c;我们经常会涉及到对数字进行比较&#xff0c;而BigDecimal作为一种高精度的数值类型&#xff0c;其…

06 使用v-model实现双向数据绑定

概述 Vue achieves two-way data binding by creating a dedicated directive that watches a data property within your Vue component. The v-model directive triggers data updates when the target data property is modified on the UI. Vue 通过创建一个专用指令来观…

IntelliJ IDEA 自带HTTP Client接口插件上传文件示例

如何使用IntelliJ IDEA自带的HTTP Client接口插件进行文件上传的示例。在这个示例中&#xff0c;我们将关注Controller代码、HTTP请求文件&#xff08;xxx.http&#xff09;&#xff0c;以及文件的上传和处理。 Controller代码 首先&#xff0c;让我们看一下处理文件上传的Co…

第15章 《乐趣》Page305~311, 代码精简以后,讨论一下引用含义的问题

将Page305~311的代码精简了一下&#xff0c;讨论一下引用含义的问题&#xff0c;精简之后的代码如下&#xff1a; #include <iostream> #include <SDL2/SDL.h>using namespace std;namespace sdl2 {char const* last_error() {return SDL_GetError(); }struct Ini…

基于 WebSocket 打造聊天室

一、什么是 WebSocket&#xff1f; WebSocket 是一种基于TCP连接上进行 全双工 通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c…

第三十六章 XML 模式的高级选项 - 创建子类型的替换组

文章目录 第三十六章 XML 模式的高级选项 - 创建子类型的替换组创建子类型的替换组将子类限制在替换组中 第三十六章 XML 模式的高级选项 - 创建子类型的替换组 创建子类型的替换组 XML 模式规范还允许定义替换组&#xff0c;这可以是创建选择的替代方法。语法有些不同。无需…

Windows 10如何关闭系统自动更新(实用教程)

本章教程&#xff0c;用最简洁的方式介绍在windows10中如何关闭系统自动更新。 目录 一、关闭自动更新服务 二、关闭自动更新组策略 一、关闭自动更新服务 1、 winr 2、services.msc 3、找到并双击 Windows Update 修改启动类型为禁用 二、关闭自动更新组策略 1、winr 2、gp…

2.4【渲染】Vulkan渲染APIs

写在前面 Screen支持Khronos的Vulkan渲染API。Vulkan是一款用于3D图形和计算的低开销、跨平台、开放行业标准API。它使开发人员能够使用相同的图形API来面向各种设备。 Vulkan标准由Khronos Group发布。 通常,硬件供应商都有自己的Khronos标准实现,利用硬件加速,特别是GP…

Next.js 学习笔记(一)——安装

安装 系统要求&#xff1a; Node.js 18.17 或更高版本支持 macOS、Windows&#xff08;包括 WSL&#xff09;和 Linux 自动安装 我们建议使用 create-next-app 启动一个新的 Next.js 应用程序&#xff0c;该应用程序会自动为你设置所有内容。要创建项目&#xff0c;请运行&…

3. 内容模块管理 - 异常处理与校验

文章目录 内容模块管理一、自定义异常1.1 全局异常处理器1.2 自定义异常1.3 异常统一响应类1.4 封装通用异常信息 二、JSR303校验2.1 Maven坐标2.2 校验规则2.3 代码示例2.4 捕捉校验异常2.5 分组校验2.6 备注 三、全局异常处理23.1 全局异常处理器3.2 结果集3.3 常用注解3.3.1…

【漏洞复现】捷诚管理信息系统 SQL注入漏洞

漏洞描述 捷诚管理信息系统是一款功能全面,可以支持自营、联营到外柜租赁的管理,其自身带工作流管理工具,能够帮助企业有效的开展内部审批工作。 该系统CWSFinanceCommon.asmx接口存在SQL注入漏洞。未经身份认证的攻击者可以通过该漏洞获取数据库敏感信息,深入利用可获取…

Redis设计与实现之整数集合

目录 一、内存映射数据结构 二、整数集合 1、整数集合的应用 2、数据结构和主要操作 3、intset运行实例 创建新intset 添加新元素到 intset 添加新元素到 intset&#xff08;不需要升级&#xff09; 添加新元素到 intset (需要升级) 4、升级 升级实例 5、关于升级 …

GZ015 机器人系统集成应用技术样题4-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题4 选手须知&#xff1a; 本任务书共 25页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

Flutter在Android Studio上创建项目与构建模式

一、安装插件 1、前提条件&#xff0c;安装配置好Android Studio环境 2、安装Flutter和Dart插件 Linux或者Windows平台&#xff1a; 1&#xff09;、打开File > Settings。 2&#xff09;、在左侧列表中&#xff0c;选择"Plugins"右侧上方面板选中 "Market…

vue-element-admin如何把mock换成使用真实后台接口

1&#xff09;修改vue.config.js文件 use strict const path require(path) const defaultSettings require(./src/settings.js)function resolve(dir) {return path.join(__dirname, dir) }const name defaultSettings.title || vue Element Admin // page title// If you…

Vue3-16-【v-model】 表单数据绑定

作用描述 v-model 指令&#xff0c;实现了 表单输入组件的值 与 js 中的变量的值的绑定关系。 当我们在页面上执行输入动作时&#xff0c;js中变量的值也会同步发生变化。表单不仅仅局限于输入框&#xff0c;其他的如 &#xff1a; 单选按钮&#xff0c;复选框&#xff0c;下拉…

数据结构面试题和题目解析

以下是一些数据结构的面试题和解析&#xff1a; 1. 什么是链表&#xff1f; 链表是一种线性数据结构&#xff0c;由一系列节点组成&#xff0c;每个节点包含数据部分和指向下一个节点的指针。链表的主要优点是插入和删除操作比较方便&#xff0c;但访问链表中的元素不如访问数组…