我如何一次从一个文件执行查询

问题描述 投票:0回答:1

我有一个大文件,其中包含一些需要在php上运行的SQL查询。我的项目基于Laravel v5.6编写,因此我使用Laravel的DB Facade运行位于我的sql文件中的sql查询。

运行数据库查询的代码是:

            $sqlFile=gzopen(__DIR__.'/../sql/queries.sql.gz','r');

            if($sqlFile==false){
                throw new \Exception('Failed to migrate the legacy database');
            }
            echo "Reading ".__DIR__.'/../sql/queries.sql.gz';
            $sql="";
            while (false !== $chunk = gzread($sqlFile, 1000)) {
                $sql.=$chunk;
            }

            gzclose($sqlFile);
            echo "Running Sql";
            DB::connection('etable')->unprepared($sql);

[我想做的是对我的queries.sql.gz进行块处理,以便一次运行一次SQL查询。假设查询可能非常复杂,例如:


select * from (
  select * from table1 where age >20
) as seniors JOIN
(
  select * from table1 where age <2
) as children on seniors.child_id=children.id;

因此,我想立即从文件中读取整个查询以执行该查询,以加快处理速度。但是,如何检测是否已读取整个查询?

您可以看到我运行了整个文件的内容,然后一起执行了所有查询。

压缩文件的大小如下:

ls -l ./database/sql
σύνολο 116
-rw-rw-r-- 1 pcmagas pcmagas 117868 Ιαν   9 11:10 test_etable.sql.gz

而且,一旦我在上面运行这段代码,就会花费30多分钟的时间来读取它。该代码本身将在迁移脚本上运行,并且我计划在CI / CD管道上运行它,因此,我希望尽快运行。

php laravel-5.6
1个回答
0
投票

嗯,您需要结合使用python和php。使用python,您需要将文件“压缩”为较小的单查询文件,而在php中,您只需扫描目录中的文件,然后按顺序执行即可。

对于python部分,您只需要库sqlparse和以下脚本:

#! /usr/bin/env python

import sqlparse
import gzip
import os 

file='/home/pcmagas/Kwdikas/etable-api/database/sql/myapp.sql.gz'
dir_path = os.path.dirname(os.path.realpath(file))

file_handler=gzip.open(file,'r')
sql=file_handler.read()
queries=sqlparse.split(sql)

i=1;
for query in queries:
    file=open(dir_path+'_'+str(i)+'_'+'myapp_migration.sql','w')
    file.write(query)
    file.close()
    i+=1

然后您需要通过php的scandir()进行迭代,然后一一读取文件内容,然后一一执行每个查询。

© www.soinside.com 2019 - 2024. All rights reserved.