import json
from datetime import timedelta, datetime
from unittest.mock import patch, Mock, ANY
import sqlparse
from django.contrib.auth import get_user_model
from django.test import TestCase
from common.config import SysConfig
from sql.engines import EngineBase
from sql.engines.goinception import GoInceptionEngine
from sql.engines.models import ResultSet, ReviewSet, ReviewResult
from sql.engines.mssql import MssqlEngine
from sql.engines.redis import RedisEngine
from sql.engines.pgsql import PgSQLEngine
from sql.engines.oracle import OracleEngine
from sql.engines.mongo import MongoEngine
from sql.engines.clickhouse import ClickHouseEngine
from sql.engines.odps import ODPSEngine
from sql.models import Instance, SqlWorkflow, SqlWorkflowContent
User = get_user_model()
class TestReviewSet(TestCase):
def test_review_set(self):
new_review_set = ReviewSet()
new_review_set.rows = [{"id": "1679123"}]
self.assertIn("1679123", new_review_set.json())
class TestEngineBase(TestCase):
@classmethod
def setUpClass(cls):
cls.u1 = User(username="some_user", display="用户1")
cls.u1.save()
cls.ins1 = Instance(
instance_name="some_ins",
type="master",
db_type="mssql",
host="some_host",
port=1366,
user="ins_user",
password="some_str",
)
cls.ins1.save()
cls.wf1 = SqlWorkflow.objects.create(
workflow_name="some_name",
group_id=1,
group_name="g1",
engineer=cls.u1.username,
engineer_display=cls.u1.display,
audit_auth_groups="some_group",
create_time=datetime.now() - timedelta(days=1),
status="workflow_finish",
is_backup=True,
instance=cls.ins1,
db_name="some_db",
syntax_type=1,
)
cls.wfc1 = SqlWorkflowContent.objects.create(
workflow=cls.wf1,
sql_content="some_sql",
execute_result=json.dumps([{"id": 1, "sql": "some_content"}]),
)
@classmethod
def tearDownClass(cls):
cls.wfc1.delete()
cls.wf1.delete()
cls.ins1.delete()
cls.u1.delete()
def test_init_with_ins(self):
engine = EngineBase(instance=self.ins1)
self.assertEqual(self.ins1.instance_name, engine.instance_name)
self.assertEqual(self.ins1.user, engine.user)
class TestMssql(TestCase):
@classmethod
def setUpClass(cls):
cls.ins1 = Instance(
instance_name="some_ins",
type="slave",
db_type="mssql",
host="some_host",
port=1366,
user="ins_user",
password="some_str",
)
cls.ins1.save()
cls.engine = MssqlEngine(instance=cls.ins1)
cls.wf = SqlWorkflow.objects.create(
workflow_name="some_name",
group_id=1,
group_name="g1",
engineer_display="",
audit_auth_groups="some_group",
create_time=datetime.now() - timedelta(days=1),
status="workflow_finish",
is_backup=True,
instance=cls.ins1,
db_name="some_db",
syntax_type=1,
)
SqlWorkflowContent.objects.create(
workflow=cls.wf, sql_content="insert into some_tb values (1)"
)
@classmethod
def tearDownClass(cls):
cls.ins1.delete()
cls.wf.delete()
SqlWorkflowContent.objects.all().delete()
@patch("sql.engines.mssql.pyodbc.connect")
def testGetConnection(self, connect):
new_engine = MssqlEngine(instance=self.ins1)
new_engine.get_connection()
connect.assert_called_once()
@patch("sql.engines.mssql.pyodbc.connect")
def testQuery(self, connect):
cur = Mock()
connect.return_value.cursor = cur
cur.return_value.execute = Mock()
cur.return_value.fetchmany.return_value = (("v1", "v2"),)
cur.return_value.description = (
("k1", "some_other_des"),
("k2", "some_other_des"),
)
new_engine = MssqlEngine(instance=self.ins1)
query_result = new_engine.query(sql="some_str", limit_num=100)
cur.return_value.execute.assert_called()
cur.return_value.fetchmany.assert_called_once_with(100)
connect.return_value.close.assert_called_once()
self.assertIsInstance(query_result, ResultSet)
@patch.object(MssqlEngine, "query")
def testAllDb(self, mock_query):
db_result = ResultSet()
db_result.rows = [("db_1",), ("db_2",)]
mock_query.return_value = db_result
new_engine = MssqlEngine(instance=self.ins1)
dbs = new_engine.get_all_databases()
self.assertEqual(dbs.rows, ["db_1", "db_2"])
@patch.object(MssqlEngine, "query")
def testAllTables(self, mock_query):
table_result = ResultSet()
table_result.rows = [("tb_1", "some_des"), ("tb_2", "some_des")]
mock_query.return_value = table_result
new_engine = MssqlEngine(instance=self.ins1)
tables = new_engine.get_all_tables("some_db")
mock_query.assert_called_once_with(db_name="some_db", sql=ANY)
self.assertEqual(tables.rows, ["tb_1", "tb_2"])
@patch.object(MssqlEngine, "query")
def testAllColumns(self, mock_query):
db_result = ResultSet()
db_result.rows = [("col_1", "type"), ("col_2", "type2")]
mock_query.return_value = db_result
new_engine = MssqlEngine(instance=self.ins1)
dbs = new_engine.get_all_columns_by_tb("some_db", "some_tb")
self.assertEqual(dbs.rows, ["col_1", "col_2"])
@patch.object(MssqlEngine, "query")
def testDescribe(self, mock_query):
new_engine = MssqlEngine(instance=self.ins1)
new_engine.describe_table("some_db", "some_db")
mock_query.assert_called_once()
def testQueryCheck(self):
new_engine = MssqlEngine(instance=self.ins1)
# 只抽查一个函数
banned_sql = "select concat(phone,1) from user_table"
check_result = new_engine.query_check(db_name="some_db", sql=banned_sql)
self.assertTrue(check_result.get("bad_query"))
banned_sql = "select phone from user_table where phone=concat(phone,1)"
check_result = new_engine.query_check(db_name="some_db", sql=banned_sql)
self.assertTrue(check_result.get("bad_query"))
sp_sql = "sp_helptext '[SomeName].[SomeAction]'"
check_result = new_engine.query_check(db_name="some_db", sql=sp_sql)
self.assertFalse(check_result.get("bad_query"))
self.assertEqual(check_result.get("filtered_sql"), sp_sql)
def test_filter_sql(self):
new_engine = MssqlEngine(instance=self.ins1)
# 只抽查一个函数
banned_sql = "select user from user_table"
check_result = new_engine.filter_sql(sql=banned_sql, limit_num=10)
self.assertEqual(check_result, "select top 10 user from user_table")
def test_filter_sql_with_distinct(self):
new_engine = MssqlEngine(instance=self.ins1)
# 只抽查一个函数
banned_sql = "select distinct * from user_table"
check_result = new_engine.filter_sql(sql=banned_sql, limit_num=10)
self.assertEqual(check_result, "select distinct top 10 * from user_table")
def test_execute_check(self):
new_engine = MssqlEngine(instance=self.ins1)
test_sql = (
"use database\ngo\nsome sql1\nGO\nsome sql2\n\r\nGo\nsome sql3\n\r\ngO\n"
)
check_result = new_engine.execute_check(db_name=None, sql=test_sql)
self.assertIsInstance(check_result, ReviewSet)
self.assertEqual(check_result.rows[1].__dict__["sql"], "use database\n")
self.assertEqual(check_result.rows[2].__dict__["sql"], "\nsome sql1\n")
self.assertEqual(check_result.rows[4].__dict__["sql"], "\nsome sql3\
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
sql-使用python开发的sql查询平台-优质项目.zip (372个子文件)
my.cnf 911B
nginx.conf 3KB
supervisord.conf 552B
supervisord.conf 392B
bootstrap.css 143KB
bootstrap.min.css 119KB
font-awesome.css 34KB
font-awesome.min.css 28KB
bootstrap-theme.css 25KB
bootstrap-theme.min.css 23KB
bootstrap-editable.css 21KB
bootstrap-datetimepicker.css 12KB
bootstrap-select.css 12KB
bootstrap-select.min.css 10KB
bootstrap-table.min.css 9KB
daterangepicker.css 8KB
fileinput.min.css 8KB
sb-admin-2.css 7KB
sb-admin-2.min.css 7KB
bootstrap-switch.min.css 5KB
bootstrap-table.min.css 5KB
style.css 4KB
metisMenu.min.css 2KB
Dockerfile 834B
Dockerfile-base 295B
.dockerignore 31B
.env 679B
fontawesome-webfont.eot 75KB
glyphicons-halflings-regular.eot 20KB
loading.gif 2KB
loading.gif 847B
.gitignore 6B
.gitkeep 0B
.gitkeep 0B
.gitkeep 0B
.gitkeep 0B
.gitkeep 0B
.gitkeep 0B
.helmignore 342B
instanceaccount.html 100KB
config.html 92KB
sqlquery.html 68KB
sqladvisor.html 55KB
dbdiagnostic.html 47KB
detail.html 43KB
sqlsubmit.html 35KB
base.html 30KB
archive.html 30KB
queryapplylist.html 30KB
slowquery.html 30KB
data_dictionary.html 28KB
my2sql.html 21KB
sqlanalyze.html 20KB
archivedetail.html 20KB
database.html 20KB
sqlworkflow.html 17KB
audit_sqlworkflow.html 16KB
param.html 16KB
schemasync.html 13KB
instance.html 12KB
queryuserprivileges.html 12KB
groupmgmt.html 11KB
2fa.html 11KB
audit.html 10KB
audit_sqlquery.html 10KB
login.html 10KB
workflow.html 9KB
dashboard.html 8KB
rollback.html 7KB
queryapplydetail.html 6KB
group.html 5KB
dictionaryexport.html 2KB
dbaprinciples.html 963B
workflow_display.html 780B
legacy_login_form.html 638B
404.html 157B
500.html 102B
400.html 101B
403.html 97B
error.html 90B
favicon.ico 0B
pdfmake.min.js 1.03MB
vfs_fonts.js 933KB
mirza_fonts.js 920KB
echarts.min.js 762KB
xlsx.core.min.js 446KB
ace.js 388KB
jspdf.min.js 232KB
bootstrap-editable.js 226KB
html2canvas.min.js 162KB
bootstrap-table.min.js 118KB
sql-formatter.js 108KB
bootstrap-select.js 106KB
fileinput.min.js 86KB
jquery.min.js 85KB
bootstrap-editable.min.js 74KB
bootstrap.js 74KB
bootstrap-datetimepicker.js 68KB
daterangepicker.js 62KB
mode-pgsql.js 60KB
共 372 条
- 1
- 2
- 3
- 4
资源评论
极智视界
- 粉丝: 2w+
- 资源: 1524
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功