【问题标题】:How to generate a table backup programatically with Laravel?如何使用 Laravel 以编程方式生成表备份?
【发布时间】:2019-08-01 13:14:44
【问题描述】:

我想在 Laravel 中做一份工作,它将截断数据库并重新填充它。但是,我想确保我首先备份了表,但我不确定如何从同一个作业中创建一个包含该表中所有行的文件。我尝试使用 csv 文件(使用 LaraCSV)

public function respaldaDevices() {
        $model = Device::get();
        $csvExport = new \Laracsv\Export();
        $campos = ['serial', 'code', 'rotulo', 'model_id', 
        'location_id', 'fecha_recepcion', 'guia_recepcion', 'fecha_instalacion',
        'fecha_reversa', 'guia_reversa', 'pep', 'status_id', 'serial_prev', 
        'reversa_prev', 'str_id', 'customer_id', 'technician_id', 'provider_id', 'obs'];
        $content = $csvExport->build($model,$campos)->getWriter()->getContent();
        $date = date('d-m-Y H-i-s');
        Storage::disk('public')->put('respaldo-devices-' . $date . '.csv', $content);
    }

但我更喜欢插入语句。

编辑: 到目前为止我尝试过的:

安装 Symfony 进程和

use Symfony\Component\Process\Process;

$process = new Process(array('mysqldump', sprintf('-u%s', getenv('DB_USERNAME')),'reportes','devices > devices-'.time().'.sql'));

Mysqldump 返回错误 6.

编辑 2:

让它与一个不推荐使用的选项一起工作:

$process = new Process(
                    "mysqldump " . sprintf('-u%s', getenv('DB_USERNAME')) . " ".  " " . "reportes " . "devices > storage\app\devices-".time().".sql --no-create-info"
        );
        $process->run();

我想知道如何做同样的事情,但使用数组。

【问题讨论】:

  • 您可以根据得到的查询结果自己生成插入查询。
  • 您可以将模型序列化为 JSON,将所有记录保存到 .json 文件中,然后进行解析。 laravel.com/docs/5.8/…
  • 我刚刚使用 JSON 进行了尝试,但对于我需要使用的表来说,它需要的时间太长了。
  • 它没有错误,易于使用和更改。 stackoverflow.com/questions/58207052/…

标签: laravel eloquent


【解决方案1】:

您可以改用mysqldump 等特定于操作系统的工具。您可以使用process 调用它。

流程使用示例:

$process = new Process([
    'mysqldump',
    sprintf('-u%s', 'my-username'),
    sprintf('-p%s', 'my-password'),
    'my-database my-table', // 'my-table' can be left out for a backup of the entire database
    '--add-drop-database', // optional
]);

$process->run();

if (!$process->isSuccessful()) {
    throw new \Exception('Failed to create backup');
}

$date = date('d-m-Y H-i-s');
Storage::disk('public')->put('respaldo-devices-' . $date . '.csv', $process->getOutput());

【讨论】:

  • 我正在尝试这个,但它可能由于滥用 $process = new Process(array( 'mysqldump', '-u'.getenv('DB_USERNAME'), '-p'. getenv('DB_PASSWORD'), 'reportes', 'devices > storage\app\devices-'.time().'.sql' )); $process->run();
  • 我正在尝试获取表,而不是整个数据库,我得到错误 6,而在 cmd 上使用相同的字符串没有问题。
  • 你说得对,我忘记了那部分。如果你想备份一个表,你可以specify an additional argument after the database
  • 乍一看,您似乎在存储实际输出时遇到了问题,因此我更新了我的示例,大致了解了如何执行此操作。如果您有大输出的内存问题,您可以考虑在生成过程输出时写入它。你可以通过使用$process->start()然后循环$process来实现,更多信息可以在here找到
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多