Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

Wondermique
Copy link

@Wondermique Wondermique commented Jun 20, 2024

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

sql/engines/offlinedownload.py Fixed Show fixed Hide fixed
common/check.py Fixed Show resolved Hide resolved
sql/engines/offlinedownload.py Fixed Show resolved Hide resolved
@Wondermique
Copy link
Author

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

@LeoQuote
Copy link
Collaborator

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

	添加导出工单参数,默认为非导出工单

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

except Exception as e:
action = "离线下载失败"
return HttpResponse(f"下载失败:{e}", status=500)

Check warning

Code scanning / CodeQL

Information exposure through an exception Medium

Stack trace information
flows to this location and may be exposed to an external user.
elif storage_type == "local":
local_path = r"{}".format(request.POST.get("local_path"))
try:
if not os.path.exists(local_path):

Check failure

Code scanning / CodeQL

Uncontrolled data used in path expression High

This path depends on a
user-provided value
.
def download_from_local(self):
file_path = os.path.join(self.local_path, self.file_name)

with open(file_path, "rb") as file:

Check failure

Code scanning / CodeQL

Uncontrolled data used in path expression High

This path depends on a
user-provided value
.
@Wondermique
Copy link
Author

Wondermique commented Jun 28, 2024

谢谢你的新功能,能否考虑将写入文件抽象一下,或使用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
Copy link
Collaborator

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

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

@feiazifeiazi
Copy link
Contributor

下载功能,挺好的。

@feiazifeiazi
Copy link
Contributor

@Wondermique 这个pr有进展吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants