mirror of https://github.com/midoks/mdserver-web
parent
0e75844fd3
commit
c876c59e4f
@ -0,0 +1,401 @@ |
||||
# coding: utf-8 |
||||
|
||||
# --------------------------------------------------------------------------------- |
||||
# MW-Linux面板 |
||||
# --------------------------------------------------------------------------------- |
||||
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. |
||||
# --------------------------------------------------------------------------------- |
||||
# Author: midoks <midoks@163.com> |
||||
# --------------------------------------------------------------------------------- |
||||
|
||||
# --------------------------------------------------------------------------------- |
||||
# sqlite3操作 |
||||
# --------------------------------------------------------------------------------- |
||||
|
||||
|
||||
import sqlite3 |
||||
import os |
||||
import sys |
||||
|
||||
|
||||
class Sql(): |
||||
#------------------------------ |
||||
# 数据库操作类 For sqlite3 |
||||
#------------------------------ |
||||
__DB_FILE = None # 数据库文件 |
||||
__DB_CONN = None # 数据库连接对象 |
||||
__DB_TABLE = "" # 被操作的表名称 |
||||
__OPT_WHERE = "" # where条件 |
||||
__OPT_LIMIT = "" # limit条件 |
||||
__OPT_GROUP = "" # group条件 |
||||
__OPT_ORDER = "" # order条件 |
||||
__OPT_FIELD = "*" # field条件 |
||||
__OPT_PARAM = () # where值 |
||||
|
||||
def __init__(self): |
||||
self.__DB_FILE = 'data/default.db' |
||||
|
||||
def __getConn(self): |
||||
# 取数据库对象 |
||||
try: |
||||
if self.__DB_CONN == None: |
||||
self.__DB_CONN = sqlite3.connect(self.__DB_FILE) |
||||
self.__DB_CONN.text_factory = str |
||||
except Exception as ex: |
||||
# print(mw.getTracebackInfo()) |
||||
return "error: " + str(ex) |
||||
|
||||
def changeTextFactoryToBytes(self): |
||||
self.__DB_CONN.text_factory = bytes |
||||
return True |
||||
|
||||
def autoTextFactory(self): |
||||
if sys.version_info[0] == 3: |
||||
self.__DB_CONN.text_factory = lambda x: str( |
||||
x, encoding="utf-8", errors='ignore') |
||||
else: |
||||
self.__DB_CONN.text_factory = lambda x: unicode( |
||||
x, "utf-8", "ignore") |
||||
|
||||
def dbfile(self, name): |
||||
self.__DB_FILE = 'data/' + name + '.db' |
||||
return self |
||||
|
||||
def dbPos(self, path, name, suffix_name = 'db'): |
||||
self.__DB_FILE = path + '/' + name + '.' + suffix_name |
||||
return self |
||||
|
||||
def table(self, table): |
||||
# 设置表名 |
||||
self.__DB_TABLE = table |
||||
return self |
||||
|
||||
def where(self, where, param=()): |
||||
# WHERE条件 |
||||
if where: |
||||
self.__OPT_WHERE = " WHERE " + where |
||||
self.__OPT_PARAM = param |
||||
return self |
||||
|
||||
def andWhere(self, where, param): |
||||
# WHERE条件 |
||||
if where: |
||||
self.__OPT_WHERE = self.__OPT_WHERE + " and " + where |
||||
# print(param) |
||||
# print(self.__OPT_PARAM) |
||||
self.__OPT_PARAM = self.__OPT_PARAM + param |
||||
return self |
||||
|
||||
def order(self, order): |
||||
# ORDER条件 |
||||
if len(order): |
||||
self.__OPT_ORDER = " ORDER BY " + order |
||||
else: |
||||
self.__OPT_ORDER = "" |
||||
return self |
||||
|
||||
def group(self, group): |
||||
if len(group): |
||||
self.__OPT_GROUP = " GROUP BY " + group |
||||
else: |
||||
self.__OPT_GROUP = "" |
||||
return self |
||||
|
||||
def limit(self, limit): |
||||
# LIMIT条件 |
||||
if len(limit): |
||||
self.__OPT_LIMIT = " LIMIT " + limit |
||||
else: |
||||
self.__OPT_LIMIT = "" |
||||
return self |
||||
|
||||
def field(self, field): |
||||
# FIELD条件 |
||||
if len(field): |
||||
self.__OPT_FIELD = field |
||||
return self |
||||
|
||||
def select(self): |
||||
# 查询数据集 |
||||
self.__getConn() |
||||
try: |
||||
sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \ |
||||
self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT |
||||
# print(sql) |
||||
# print(self.__OPT_PARAM) |
||||
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) |
||||
data = result.fetchall() |
||||
# 构造字曲系列 |
||||
if self.__OPT_FIELD != "*": |
||||
field = self.__OPT_FIELD.split(',') |
||||
tmp = [] |
||||
for row in data: |
||||
i = 0 |
||||
tmp1 = {} |
||||
for key in field: |
||||
tmp1[key] = row[i] |
||||
i += 1 |
||||
tmp.append(tmp1) |
||||
del(tmp1) |
||||
data = tmp |
||||
del(tmp) |
||||
else: |
||||
# 将元组转换成列表 |
||||
tmp = map(list, data) |
||||
data = tmp |
||||
del(tmp) |
||||
self.__close() |
||||
return data |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def inquiry(self, input_field=''): |
||||
# 查询数据集 |
||||
# 不清空查询参数 |
||||
self.__getConn() |
||||
try: |
||||
sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + \ |
||||
self.__OPT_WHERE + self.__OPT_GROUP + self.__OPT_ORDER + self.__OPT_LIMIT |
||||
|
||||
if os.path.exists('data/debug.pl'): |
||||
print(sql, self.__OPT_PARAM) |
||||
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) |
||||
data = result.fetchall() |
||||
# 构造字曲系列 |
||||
if self.__OPT_FIELD != "*": |
||||
|
||||
if input_field != "": |
||||
field = input_field.split(',') |
||||
else: |
||||
field = self.__OPT_FIELD.split(',') |
||||
|
||||
tmp = [] |
||||
for row in data: |
||||
i = 0 |
||||
tmp1 = {} |
||||
for key in field: |
||||
tmp1[key] = row[i] |
||||
i += 1 |
||||
tmp.append(tmp1) |
||||
del(tmp1) |
||||
data = tmp |
||||
del(tmp) |
||||
else: |
||||
# 将元组转换成列表 |
||||
tmp = map(list, data) |
||||
data = tmp |
||||
del(tmp) |
||||
return data |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def getField(self, keyName): |
||||
# 取回指定字段 |
||||
result = self.field(keyName).select() |
||||
# print(result) |
||||
if len(result) == 1: |
||||
return result[0][keyName] |
||||
return result |
||||
|
||||
def setField(self, keyName, keyValue): |
||||
# 更新指定字段 |
||||
return self.save(keyName, (keyValue,)) |
||||
|
||||
def find(self): |
||||
# 取一行数据 |
||||
result = self.limit("1").select() |
||||
if len(result) == 1: |
||||
return result[0] |
||||
return result |
||||
|
||||
def count(self): |
||||
# 取行数 |
||||
key = "COUNT(*)" |
||||
data = self.field(key).select() |
||||
try: |
||||
return int(data[0][key]) |
||||
except: |
||||
return 0 |
||||
|
||||
def add(self, keys, param): |
||||
# 插入数据 |
||||
self.__getConn() |
||||
try: |
||||
values = "" |
||||
for key in keys.split(','): |
||||
values += "?," |
||||
values = self.checkInput(values[0:len(values) - 1]) |
||||
sql = "INSERT INTO " + self.__DB_TABLE + \ |
||||
"(" + keys + ") " + "VALUES(" + values + ")" |
||||
result = self.__DB_CONN.execute(sql, param) |
||||
last_id = result.lastrowid |
||||
self.__close() |
||||
self.__DB_CONN.commit() |
||||
return last_id |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
# 插入数据 |
||||
def insert(self, pdata): |
||||
if not pdata: |
||||
return False |
||||
keys, param = self.__format_pdata(pdata) |
||||
return self.add(keys, param) |
||||
|
||||
# 更新数据 |
||||
def update(self, pdata): |
||||
if not pdata: |
||||
return False |
||||
keys, param = self.__format_pdata(pdata) |
||||
return self.save(keys, param) |
||||
|
||||
# 构造数据 |
||||
def __format_pdata(self, pdata): |
||||
keys = pdata.keys() |
||||
keys_str = ','.join(keys) |
||||
param = [] |
||||
for k in keys: |
||||
param.append(pdata[k]) |
||||
return keys_str, tuple(param) |
||||
|
||||
def checkInput(self, data): |
||||
if not data: |
||||
return data |
||||
if type(data) != str: |
||||
return data |
||||
checkList = [ |
||||
{'d': '<', 'r': '<'}, |
||||
{'d': '>', 'r': '>'}, |
||||
{'d': '\'', 'r': '‘'}, |
||||
{'d': '"', 'r': '“'}, |
||||
{'d': '&', 'r': '&'}, |
||||
{'d': '#', 'r': '#'}, |
||||
{'d': '<', 'r': '<'} |
||||
] |
||||
for v in checkList: |
||||
data = data.replace(v['d'], v['r']) |
||||
return data |
||||
|
||||
def addAll(self, keys, param): |
||||
# 插入数据 |
||||
self.__getConn() |
||||
try: |
||||
values = "" |
||||
for key in keys.split(','): |
||||
values += "?," |
||||
values = values[0:len(values) - 1] |
||||
sql = "INSERT INTO " + self.__DB_TABLE + \ |
||||
"(" + keys + ") " + "VALUES(" + values + ")" |
||||
result = self.__DB_CONN.execute(sql, param) |
||||
return True |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def commit(self): |
||||
self.__close() |
||||
self.__DB_CONN.commit() |
||||
|
||||
def save(self, keys, param): |
||||
# 更新数据 |
||||
self.__getConn() |
||||
try: |
||||
opt = "" |
||||
for key in keys.split(','): |
||||
opt += key + "=?," |
||||
opt = opt[0:len(opt) - 1] |
||||
sql = "UPDATE " + self.__DB_TABLE + " SET " + opt + self.__OPT_WHERE |
||||
|
||||
# import mw |
||||
# mw.writeFile('/tmp/test.pl', sql) |
||||
|
||||
# 处理拼接WHERE与UPDATE参数 |
||||
tmp = list(param) |
||||
for arg in self.__OPT_PARAM: |
||||
tmp.append(arg) |
||||
self.__OPT_PARAM = tuple(tmp) |
||||
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) |
||||
self.__close() |
||||
self.__DB_CONN.commit() |
||||
return result.rowcount |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def delete(self, id=None): |
||||
# 删除数据 |
||||
self.__getConn() |
||||
try: |
||||
if id: |
||||
self.__OPT_WHERE = " WHERE id=?" |
||||
self.__OPT_PARAM = (id,) |
||||
sql = "DELETE FROM " + self.__DB_TABLE + self.__OPT_WHERE |
||||
result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) |
||||
self.__close() |
||||
self.__DB_CONN.commit() |
||||
return result.rowcount |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def originExecute(self, sql, param=()): |
||||
self.__getConn() |
||||
try: |
||||
result = self.__DB_CONN.execute(sql, param) |
||||
self.__DB_CONN.commit() |
||||
return result |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def execute(self, sql, param=()): |
||||
# 执行SQL语句返回受影响行 |
||||
self.__getConn() |
||||
# print sql, param |
||||
try: |
||||
result = self.__DB_CONN.execute(sql, param) |
||||
self.__DB_CONN.commit() |
||||
return result.rowcount |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def query(self, sql, param=()): |
||||
# 执行SQL语句返回数据集 |
||||
self.__getConn() |
||||
try: |
||||
result = self.__DB_CONN.execute(sql, param) |
||||
# 将元组转换成列表 |
||||
# data = map(list, result) |
||||
return result |
||||
except Exception as ex: |
||||
return "error: " + str(ex) |
||||
|
||||
def create(self, name): |
||||
# 创建数据表 |
||||
self.__getConn() |
||||
import mw |
||||
script = mw.readFile('data/' + name + '.sql') |
||||
result = self.__DB_CONN.executescript(script) |
||||
self.__DB_CONN.commit() |
||||
return result.rowcount |
||||
|
||||
def fofile(self, filename): |
||||
# 执行脚本 |
||||
self.__getConn() |
||||
import mw |
||||
script = mw.readFile(filename) |
||||
result = self.__DB_CONN.executescript(script) |
||||
self.__DB_CONN.commit() |
||||
return result.rowcount |
||||
|
||||
def __close(self): |
||||
# 清理条件属性 |
||||
self.__OPT_WHERE = "" |
||||
self.__OPT_FIELD = "*" |
||||
self.__OPT_ORDER = "" |
||||
self.__OPT_LIMIT = "" |
||||
self.__OPT_PARAM = () |
||||
|
||||
def close(self): |
||||
# 释放资源 |
||||
try: |
||||
self.__DB_CONN.close() |
||||
self.__DB_CONN = None |
||||
except: |
||||
pass |
Loading…
Reference in new issue