同步操作将从 小圈圈/Archery 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# -*- coding: UTF-8 -*-"""@author: hhyo@license: Apache Licence@file: instance_database.py@time: 2019年09月19日"""import MySQLdbimport simplejson as jsonfrom django.contrib.auth.decorators import permission_requiredfrom django.http import JsonResponse, HttpResponsefrom django_redis import get_redis_connectionfrom common.utils.extend_json_encoder import ExtendJSONEncoderfrom sql.engines import get_enginefrom sql.models import Instance, InstanceDatabase, Usersfrom sql.utils.resource_group import user_instances__author__ = 'hhyo'@permission_required('sql.menu_database', raise_exception=True)def databases(request):"""获取实例数据库列表"""instance_id = request.POST.get('instance_id')saved = True if request.POST.get('saved') == 'true' else False # 平台是否保存if not instance_id:return JsonResponse({'status': 0, 'msg': '', 'data': []})try:instance = user_instances(request.user, db_type=['mysql']).get(id=instance_id)except Instance.DoesNotExist:return JsonResponse({'status': 1, 'msg': '你所在组未关联该实例', 'data': []})# 获取已录入数据库cnf_dbs = dict()for db in InstanceDatabase.objects.filter(instance=instance).values('id', 'db_name', 'owner', 'owner_display', 'remark'):db['saved'] = Truecnf_dbs[f"{db['db_name']}"] = db# 获取所有数据库sql_get_db = """SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAMEFROM information_schema.SCHEMATAWHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'test', 'sys');"""query_engine = get_engine(instance=instance)query_result = query_engine.query('information_schema', sql_get_db, close_conn=False)if not query_result.error:dbs = query_result.rows# 获取数据库关联用户信息rows = []for db in dbs:db_name = db[0]sql_get_bind_users = f"""select group_concat(distinct(GRANTEE)),TABLE_SCHEMAfrom information_schema.SCHEMA_PRIVILEGESwhere TABLE_SCHEMA='{db_name}'group by TABLE_SCHEMA;"""bind_users = query_engine.query('information_schema', sql_get_bind_users, close_conn=False).rowsrow = {'db_name': db_name,'charset': db[1],'collation': db[2],'grantees': bind_users[0][0].split(',') if bind_users else [],'saved': False}# 合并数据if db_name in cnf_dbs.keys():row = dict(row, **cnf_dbs[db_name])rows.append(row)# 过滤参数if saved:rows = [row for row in rows if row['saved']]result = {'status': 0, 'msg': 'ok', 'rows': rows}else:result = {'status': 1, 'msg': query_result.error}# 关闭连接query_engine.close()return HttpResponse(json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True),content_type='application/json')@permission_required('sql.menu_database', raise_exception=True)def create(request):"""创建数据库"""instance_id = request.POST.get('instance_id', 0)db_name = request.POST.get('db_name')owner = request.POST.get('owner', '')remark = request.POST.get('remark', '')if not all([db_name]):return JsonResponse({'status': 1, 'msg': '参数不完整,请确认后提交', 'data': []})try:instance = user_instances(request.user, db_type=['mysql']).get(id=instance_id)except Instance.DoesNotExist:return JsonResponse({'status': 1, 'msg': '你所在组未关联该实例', 'data': []})try:owner_display = Users.objects.get(username=owner).displayexcept Users.DoesNotExist:return JsonResponse({'status': 1, 'msg': '负责人不存在', 'data': []})# escapedb_name = MySQLdb.escape_string(db_name).decode('utf-8')engine = get_engine(instance=instance)exec_result = engine.execute(db_name='information_schema', sql=f"create database {db_name};")if exec_result.error:return JsonResponse({'status': 1, 'msg': exec_result.error})# 保存到数据库else:InstanceDatabase.objects.create(instance=instance, db_name=db_name, owner=owner, owner_display=owner_display, remark=remark)# 清空实例资源缓存r = get_redis_connection("default")for key in r.scan_iter(match='*insRes*', count=2000):r.delete(key)return JsonResponse({'status': 0, 'msg': '', 'data': []})@permission_required('sql.menu_database', raise_exception=True)def edit(request):"""编辑/录入数据库"""instance_id = request.POST.get('instance_id', 0)db_name = request.POST.get('db_name')owner = request.POST.get('owner', '')remark = request.POST.get('remark', '')if not all([db_name]):return JsonResponse({'status': 1, 'msg': '参数不完整,请确认后提交', 'data': []})try:instance = user_instances(request.user, db_type=['mysql']).get(id=instance_id)except Instance.DoesNotExist:return JsonResponse({'status': 1, 'msg': '你所在组未关联该实例', 'data': []})try:owner_display = Users.objects.get(username=owner).displayexcept Users.DoesNotExist:return JsonResponse({'status': 1, 'msg': '负责人不存在', 'data': []})# 更新或者录入信息InstanceDatabase.objects.update_or_create(instance=instance,db_name=db_name,defaults={"owner": owner, "owner_display": owner_display, "remark": remark})return JsonResponse({'status': 0, 'msg': '', 'data': []})
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。