【问题标题】:Switch db connection dynamically动态切换数据库连接
【发布时间】:2016-12-17 14:38:32
【问题描述】:

对于几个控制台命令,我需要更改数据库,以便我所有雄辩的命令和查询都在正确的数据库(和服务器)上运行。

我见过一些解决方案,最简单的似乎是像这样更改配置:

$new_connection = [
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'database'  => 'test_db',
        'username'  => 'test',
        'password'  => 'test',
        'charset'   => 'utf8',
        'collation' => 'utf8_general_ci',
        'prefix'    => '',
        'strict'    => false
];

config(['database.connections.mysql' => $new_connection]);
DB::purge('mysql');

(我注意到的)唯一的问题是当我尝试进行事务时,更具体地说,当我在 Codeception 的验收测试中进行事务时 - 它们根本不起作用。

我使用的命令是:

DB::connection()->beginTransaction(); // inside the _before function

DB::connection()->rollBack(); // inside the _after function

【问题讨论】:

  • 在更改配置之前尝试调用Artisan::call('config:cache');。我认为您的配置已被缓存,因此无法更改
  • @Kliment 我试过打电话给config:cache,但得到这个错误=[Symfony\Component\Debug\Exception\FatalErrorException] Declaration of Symfony\Component\Console\Input\ArrayInput::hasParameterOption() must be compatible with Symfony\Component\Console\Input\InputInterface::hasParameterOption($values, $onlyParams = false)
  • 您能否更具体地了解第二个连接。您想在使用一组命令时替换所有查询的连接,还是想使用 2 个连接并能够切换查询?
  • @ParampalPooni 它在我的项目中运行良好。也许您在某处的配置中有错误?或其他一些错误。此错误似乎是命令中的问题。尝试从控制台调用config:cache,看看是否抛出了同样的错误。
  • 如果您的逻辑要求与数据库的实现如此紧密,您可能应该考虑一个更“松散”的实现,这实际上是一个“气味”警告,您的事情过于耦合,所以避免了简单的测试。

标签: laravel eloquent codeception


【解决方案1】:

您必须创建 2 个不同的连接

http://fideloper.com/laravel-multiple-database-connections https://laravel.com/docs/5.1/database#accessing-connections

return array(
    'default' => 'mysql',

    'connections' => array(

        # Our primary database connection
        'mysql' => array(
          'driver'    => 'mysql',
          'host'      => '127.0.0.1',
          'database'  => 'test_db',
          'username'  => 'test',
          'password'  => 'test',
          'charset'   => 'utf8',
          'collation' => 'utf8_general_ci',
          'prefix'    => '',
          'strict'    => false
        ),

        # Our secondary database connection
        'mysql2' => array(
          'driver'    => 'mysql',
          'host'      => '127.0.0.1',
          'database'  => 'test_db_2',
          'username'  => 'test',
          'password'  => 'test',
          'charset'   => 'utf8',
          'collation' => 'utf8_general_ci',
          'prefix'    => '',
          'strict'    => false
        ),
    ),
);

现在当你想查询时,你必须通过你需要的连接

$users = DB::connection('mysql2')->select(...);

由于默认声明为mysql,所以可以省略。

【讨论】:

  • DB::connection('mysql2') 放在我的所有查询之前并在我的模型中指定一个连接不如只更改一次连接(即config(['database.connections.mysql' => $new_connection]);)那么有效。我只是不明白为什么交易不起作用......
  • 您是否正在修改事务中的数据库结构,因为这可能是它不起作用的一个原因。结构查询将自动提交您的事务。你能发布你的查询吗?你还说你只需要一些命令的新连接,所以你必须在这些查询中指定
【解决方案2】:

我遇到了类似的问题。要使用交易,您基本上需要使用 @Sylwit 的方法。

创建所需的数据库连接。比如说mysqlmysql1

现在在您的控制器中获取到所需数据库的连接,如下所示:

$connection = DB::connection('mysql1'); // replace this to your required connection name

现在,使用检索到的连接进行交易。

$connection->beginTransaction(); // inside the _before function

$connection->rollBack(); // inside the _after function

在您的代码中,您只需添加连接名称:

DB::connection('mysql1')->beginTransaction(); // inside the _before function

DB::connection('mysql1')->rollBack(); // inside the _after function

【讨论】:

  • @ParampalPooni 是的,我明白...不确定这是否可行,但您能否在config/database.php 文件中定义所有所需的连接。然后使用控制器中的setDefaultConnection()方法将默认连接更改为所需的连接
【解决方案3】:

您可以将带有连接名称的字符串作为参数传递给 DB::connection() 外观。

https://laravel.com/docs/5.3/database#using-multiple-database-connections

【讨论】:

  • 这应该是公认的答案,一个干净快速的解决方案。
【解决方案4】:
$config = config()->all();
$config['database']['connections']['mysql'] = $newConnection;
Artisan::call('config:clear');
config($config);

我对此进行了测试,它完成了工作

【讨论】:

    【解决方案5】:

    如果您使用的是 phpunit,请查看 phpunit.xml

    在底部你应该看到以下内容

        <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        </php>
    

    您可以为要使用的测试数据库而不是原始生产数据库分配 env 变量。

    所以创建两个连接,在 .env 中分配数据库连接名称并在 phpunit.xml 中引用测试一个 祝你好运。

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2010-12-25
      相关资源
      最近更新 更多