我有一个大文件,其中包含一些需要在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管道上运行它,因此,我希望尽快运行。
嗯,您需要结合使用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()
进行迭代,然后一一读取文件内容,然后一一执行每个查询。