hhyo / Archery

SQL 审核查询平台
https://archerydms.com
Apache License 2.0
5.75k stars 1.63k forks source link

增加离线导出工单,可通过查询页面右侧切换 #2685

Open Wondermique opened 1 week ago

Wondermique commented 1 week ago

1、sql/templates/sqlsubmit.html 添加导出工单参数,默认为非导出工单

2、sql/templates/sqlquery.html 增加导出工单表单信息,并增加扫描行数检查

3、common/templates/config.html 增加导出工单相关配置表单

4、sql/views.py 传递相关页面所需值

5、sql/templates/sqlworkflow.html 增加工单页面,导出格式的显示

6、sql/templates/detail.html 增加下载按钮,与 offlinedownload.py 交互

7、common/check.py 增加config内oss、sftp及本地存储的检查

8、sql_api/serializers.py 传递相关参数

9、sql/utils/workflow_audit.py 取消导出工单的自动审核,正常情况下导出工单不应自动审核

10、sql/engines/offlinedownload.py 导出工单主要代码

11、sql/engines/goinception.py 增加导出工单类型

12、sql/engines/mysql.py 传递相关参数

13、sql/models.py (1)syntax_type新增(3,导出工单) (2)新增字段is_offline_export、export_format、file_name (3)permissions新增("offline_download", "离线下载权限") 涉及 sql: alter table sql_workflow add column export_format varchar(10) DEFAULT NULL, add column is_offline_export varchar(3) NOT NULL, add column file_name varchar(255) DEFAULT NULL;

set @content_type_id=(select id from django_content_type where app_label='sql' and model='permission');
insert IGNORE INTO auth_permission (name, content_type_id, codename) VALUES('离线下载权限', @content_type_id, 'offline_download');

14、sql/sql_workflow.py 增加导出格式参数 15、sql/urls.py 增加 offlinedownload 的路由

新增 sql 脚本: src/init_sql/v1.11.1_offlinedownload.sql 与上方 sql 内容一致,无需反复执行 新增依赖: sqlparse==0.4.4 paramiko==3.4.0 oss2==2.18.3 openpyxl==3.1.2 image image image image image image

Wondermique commented 1 week ago

导出功能已经过几个月的使用测试,常见的情况都测试可正常使用,Excel 类型由于 Excel 自身限制1048576行,目前超出是做异常处理,后续考虑进行文件拆分。 导出工单内的超时参数,仅对导出工单生效,导出阈值为扫描函数,因此,假设阈值为 80W,实际要导出的数据只有 10 万,但没使用好索引,导致扫描 100W,依旧无法提交导出,对于多表 join 查询,扫描行数是累加的,但实际可能出现笛卡尔积,超时参数则是为了控制此时情况。 若文件本地存储,且为 docker 部署,建议在 docker-compose 文件内添加挂载目录。

LeoQuote commented 1 week ago

谢谢你的新功能,能否考虑将写入文件抽象一下,或使用django 的files 功能 https://docs.djangoproject.com/en/5.0/topics/files/ 以保证后续功能的可扩展性,比如说,有用户可能使用对象存储存放导出数据,当前的代码就比较难适应这个需求。

Wondermique commented 3 days ago

谢谢你的新功能,能否考虑将写入文件抽象一下,或使用django 的files 功能 https://docs.djangoproject.com/en/5.0/topics/files/ 以保证后续功能的可扩展性,比如说,有用户可能使用对象存储存放导出数据,当前的代码就比较难适应这个需求。

看了你提供的 files 的文档,可以用到如FileSystemStorage类,但似乎没有直接提供 如上传到 oss 这样的功能,存放文件还是要使用阿里云的接口,使用files可以通过 settings.py定义存储路径,我目前是在前端的系统配置页面写了表单,方便用户更改存储方式(如下图),files 也支持指定而非只能读取配置。 我实现上传下载的类StorageControl确实写的太长了,不方便扩展,目前打算将其每一种存储方式(现在是有 sftp、oss 和 local)都拆分成一个子类,父类主要提供通用的参数和功能,后续要扩展新的存储方式,也同样新增子类,部分可用 files 实现的就用 files 去改造(但可能不多),你看是否能满足。 image

LeoQuote commented 3 days ago

你说的没错,官方没有提供oss 集成,但这个功能是可扩展的,比如已有的项目 https://django-storages.readthedocs.io/en/latest/index.html 提供了 S3 的集成,而阿里云oss 是兼容 s3 协议的。

我个人更偏向django提供的这个interface,社区很有可能有很多现成的集成,后续archery 做自定义的扩展也会很简单,自己定义也很有可能和这个差不了多少。