mdserver-web/plugins/data_query/sql_mysql.py

261 lines
6.9 KiB
Python
Raw Normal View History

2024-02-06 06:49:15 -05:00
# coding:utf-8
import sys
import io
import os
import time
import re
import pymongo
import json
sys.path.append(os.getcwd() + "/class/core")
import mw
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
@singleton
class nosqlMySQL():
__DB_PASS = None
__DB_USER = None
2024-02-06 08:17:24 -05:00
__DB_PORT = 3306
2024-02-06 06:49:15 -05:00
__DB_HOST = '127.0.0.1'
__DB_CONN = None
__DB_ERR = None
2024-02-06 08:17:24 -05:00
__DB_SOCKET = None
2024-02-06 06:49:15 -05:00
__DB_LOCAL = None
def __init__(self):
self.__config = self.get_options(None)
2024-02-06 08:17:24 -05:00
def conn(self):
2024-02-06 06:49:15 -05:00
if self.__DB_HOST in ['127.0.0.1', 'localhost']:
my_path = "{}/mysql".format(mw.getServerDir())
if not os.path.exists(my_path): return False
if not self.__DB_LOCAL:
2024-02-06 08:17:24 -05:00
# print(self.__config)
2024-02-06 06:49:15 -05:00
self.__DB_PORT = int(self.__config['port'])
2024-02-06 08:17:24 -05:00
self.__DB_USER = self.__config['username']
self.__DB_PASS = self.__config['password']
self.__DB_SOCKET = self.__config['socket']
2024-02-06 06:49:15 -05:00
try:
2024-02-06 08:17:24 -05:00
db = mw.getMyORM()
db.setPort(self.__DB_PORT)
db.setPwd(self.__DB_PASS)
db.setUser(self.__DB_USER)
if self.__DB_SOCKET != '':
db.setSocket(self.__DB_SOCKET)
return db
2024-02-06 06:49:15 -05:00
except Exception:
self.__DB_ERR = mw.get_error_info()
return False
2024-02-06 08:17:24 -05:00
def sqliteDb(self,dbname='databases'):
my_root_path = mw.getServerDir() +'/mysql'
name = 'mysql'
conn = mw.M(dbname).dbPos(my_root_path, name)
return conn
2024-02-06 06:49:15 -05:00
# 获取配置项
def get_options(self, get=None):
result = {}
2024-02-06 08:17:24 -05:00
my_cnf_path = "{}/mysql/etc/my.cnf".format(mw.getServerDir())
my_content = mw.readFile(my_cnf_path)
if not my_content: return False
mysql_pass = self.sqliteDb('config').where('id=?', (1,)).getField('mysql_root')
result['password'] = mysql_pass
result['username'] = 'root'
2024-02-06 06:49:15 -05:00
keys = ["bind_ip", "port"]
result['host'] = '127.0.0.1'
rep = 'port\s*=\s*(.*)'
2024-02-06 08:17:24 -05:00
port_re = re.search(rep, my_content)
if port_re:
result['port'] = int(port_re.groups()[0].strip())
else:
result['port'] = 3306
socket_rep = 'socket\s*=\s*(.*)'
socket_re = re.search(socket_rep, my_content)
if socket_re:
result['socket'] = socket_re.groups()[0].strip()
2024-02-06 06:49:15 -05:00
else:
2024-02-06 08:17:24 -05:00
result['socket'] = ''
2024-02-06 06:49:15 -05:00
return result
def set_host(self, host, port, name, username, password, prefix=''):
self.__DB_HOST = host
self.__DB_PORT = int(port)
self.__DB_NAME = name
if self.__DB_NAME: self.__DB_NAME = str(self.__DB_NAME)
self.__DB_USER = str(username)
self._USER = str(username)
self.__DB_PASS = str(password)
self.__DB_PREFIX = prefix
self.__DB_LOCAL = 1
return self
@singleton
class nosqlMySQLCtr():
def __init__(self):
pass
def getInstanceBySid(self, sid = 0):
instance = nosqlMySQL()
return instance
def getDbList(self, args):
sid = args['sid']
2024-02-06 08:17:24 -05:00
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
2024-02-06 06:49:15 -05:00
return mw.returnData(False,'无法链接')
result = {}
2024-02-06 08:17:24 -05:00
db_list = my_instance.query('show databases')
2024-02-06 06:49:15 -05:00
rlist = []
2024-02-06 08:17:24 -05:00
for x in db_list:
if not x['Database'] in ['information_schema', 'mysql', 'performance_schema','sys']:
rlist.append(x['Database'])
2024-02-06 06:49:15 -05:00
result['list'] = rlist
return mw.returnData(True,'ok', result)
2024-02-06 08:17:24 -05:00
def getTableList(self, args):
2024-02-06 06:49:15 -05:00
sid = args['sid']
2024-02-06 08:17:24 -05:00
db = args['db']
2024-02-06 06:49:15 -05:00
2024-02-06 08:17:24 -05:00
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
2024-02-06 06:49:15 -05:00
return mw.returnData(False,'无法链接')
2024-02-06 08:17:24 -05:00
sql = "select * from information_schema.tables where table_schema = '"+db+"'"
table_list = my_instance.query(sql)
# print(table_list)
rlist = []
for x in table_list:
# print(x['TABLE_NAME'])
rlist.append(x['TABLE_NAME'])
2024-02-06 06:49:15 -05:00
result = {}
2024-02-06 08:17:24 -05:00
result['list'] = rlist
2024-02-06 06:49:15 -05:00
return mw.returnData(True,'ok', result)
def getDataList(self, args):
sid = args['sid']
db = args['db']
2024-02-06 08:17:24 -05:00
table = args['table']
2024-02-06 06:49:15 -05:00
p = 1
size = 10
if 'p' in args:
p = args['p']
if 'size' in args:
size = args['size']
2024-02-06 08:17:24 -05:00
start_index = (p - 1) * size
2024-02-06 06:49:15 -05:00
2024-02-06 08:17:24 -05:00
args_where = {}
2024-02-06 09:06:26 -05:00
where_sql = ''
2024-02-06 08:17:24 -05:00
if 'where' in args:
args_where = args['where']
2024-02-06 09:06:26 -05:00
if 'field' in args_where:
if args_where['field'] == 'id' or args_where['field'].find('id')>-1:
where_sql = ' where '+args_where['field'] + " = '"+args_where['value']+"' "
else:
where_sql = ' where '+args_where['field'] + " like '%"+args_where['value']+"%' "
2024-02-06 06:49:15 -05:00
2024-02-06 08:17:24 -05:00
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
2024-02-06 06:49:15 -05:00
2024-02-06 08:17:24 -05:00
my_instance.setDbName(db)
2024-02-06 09:06:26 -05:00
sql = 'select count(*) as num from ' + table + where_sql
# print(sql)
2024-02-06 08:17:24 -05:00
count_result = my_instance.query(sql)
count = count_result[0]['num']
2024-02-06 06:49:15 -05:00
2024-02-06 09:06:26 -05:00
sql = 'select * from ' + table + where_sql + ' limit '+str(start_index)+',10';
2024-02-06 08:17:24 -05:00
# print(sql)
result = my_instance.query(sql)
# print(result)
2024-02-06 06:49:15 -05:00
page_args = {}
page_args['count'] = count
2024-02-06 08:17:24 -05:00
page_args['tojs'] = 'mysqlGetDataList'
2024-02-06 06:49:15 -05:00
page_args['p'] = p
page_args['row'] = size
rdata = {}
rdata['page'] = mw.getPage(page_args)
rdata['list'] = result
rdata['count'] = count
rdata['soso_field'] = ''
if 'field' in args_where:
rdata['soso_field'] = args_where['field']
2024-02-06 09:06:26 -05:00
return mw.returnData(True,'ok', rdata)
2024-02-06 06:49:15 -05:00
2024-02-06 09:06:26 -05:00
def showProcessList(self,args):
sql = 'show processlist';
sid = args['sid']
2024-02-06 06:49:15 -05:00
2024-02-06 09:06:26 -05:00
my_instance = self.getInstanceBySid(sid).conn()
if my_instance is False:
return mw.returnData(False,'无法链接')
2024-02-06 06:49:15 -05:00
2024-02-06 09:06:26 -05:00
result = my_instance.query(sql)
rdata = {}
rdata['list'] = result
return mw.returnData(True,'ok', rdata)
2024-02-06 06:49:15 -05:00
# ---------------------------------- run ----------------------------------
# 获取 mysql 列表
def get_db_list(args):
t = nosqlMySQLCtr()
return t.getDbList(args)
# 获取 mysql 列表
2024-02-06 08:17:24 -05:00
def get_table_list(args):
2024-02-06 06:49:15 -05:00
t = nosqlMySQLCtr()
2024-02-06 08:17:24 -05:00
return t.getTableList(args)
2024-02-06 06:49:15 -05:00
def get_data_list(args):
t = nosqlMySQLCtr()
return t.getDataList(args)
2024-02-06 09:06:26 -05:00
def get_proccess_list(args):
t = nosqlMySQLCtr()
return t.showProcessList(args)
2024-02-06 06:49:15 -05:00
# 测试
def test(args):
sid = args['sid']
t = nosqlMySQLCtr()
print(t.get_options())
print("test")
return 'ok'