Example #1
0
def db_insert(*args):
    '''
    数据库插入
    :param args:参数可以是1个或者2个,1个的话就是sql语句,调用默认服务,2个的话第一个参数是数据服务key,第2个是sql语句。
    :return: 插入结果
    '''
    dbKey = "default"
    sqlstring = ""
    if len(args) == 1:
        sqlstring = args[0].strip()
    elif len(args) == 2:
        dbKey = args[0].strip()
        sqlstring = args[1].strip()
    else:
        set_result("ERROR", "执行db_select()时参数个数错误。")
        return "<ERROR:参数个数错误>"

    # 如果是更新或者删除或者插入操作,提示错误
    if sqlstring.strip().lower().startswith(
            "select ") or sqlstring.strip().lower().startswith(
                "update ") or sqlstring.strip().lower().startswith("delete "):
        set_result("ERROR", "<ERROR:只能使用INSERT语句>")
        return "<ERROR:只能使用INSERT语句>"

    if "update " in sqlstring.strip().lower() or "delete " in sqlstring.strip(
    ).lower():
        set_result("ERROR", "<ERROR:不能包含UPDATE/DELETE操作!>")
        return "<ERROR:不能包含UPDATE/DELETE操作!>"

    if dbKey in context.serviceDBDict.keys():
        db = context.serviceDBDict[dbKey]
    else:
        set_result("ERROR", "<ERROR:没有找到数据库%s的配置>" % dbKey)
        return "<ERROR:没有找到数据库%s的配置>" % dbKey

    # paramList = splitStringToListByTag(strTobeProcessed, splitTag)
    if db.connect() == False:
        set_result("ERROR", "<ERROR:service[%s]数据库连接异常>" % dbKey)
        return "<ERROR:service[%s]数据库连接异常>" % dbKey
    db.setCursorDict(True)
    res = db.execute_update_sql(sqlstring.strip())
    db.release()
    if isinstance(res, bool) and res == False:
        # check是否加了dbname.tablename
        fromTable = get_sub_string(sqlstring.strip().lower(), "insert into ",
                                   "(").strip()
        if fromTable and "." not in fromTable:
            set_result("ERROR",
                       "<ERROR:sql语句中的表名%s格式必须是database.table>" % fromTable)
            return "<ERROR:sql语句中的表名%s格式必须是database.table>" % fromTable
        else:
            set_result("ERROR",
                       "<ERROR:执行sql发生异常,请检查sql语句:%s>" % sqlstring.strip())
            return "<ERROR:执行sql发生异常,请检查sql语句:%s>" % sqlstring.strip()
    else:
        return str(res)
def db_delete(*args):
    '''
    数据库删除
    :param args:参数可以是1个或者2个,1个的话就是sql语句,调用默认服务,2个的话第一个参数是数据服务key,第2个是sql语句。
    :return: 删除结果
    '''
    dbKey = "default"
    sqlstring = ""
    if len(args) == 1:
        sqlstring = args[0]
    elif len(args) == 2:
        dbKey = args[0]
        sqlstring = args[1]
    else:
        set_result("ERROR", "执行db_select()时参数个数错误。")
        return "<ERROR:参数个数错误>"


    # 如果是更新或者删除或者插入操作,提示错误
    if sqlstring.strip().lower().startswith("select ") or sqlstring.strip().lower().startswith(
            "update ") or sqlstring.strip().lower().startswith("insert "):
        set_result("ERROR",  "<ERROR:只能使用DELETE语句>")
        return "<ERROR:只能使用DELETE语句>"

    if "update " in sqlstring.strip().lower() or "insert " in sqlstring.strip().lower():
        set_result("ERROR",  "<ERROR:不能包含UPDATE/INSERT操作!>")
        return "<ERROR:不能包含UPDATE/INSERT操作!>"

    if " where " not in sqlstring.strip().lower():
        set_result("ERROR",  "<ERROR:必须包含where子句!>")
        return "<ERROR:必须包含where子句!>"


    if dbKey in context.serviceDBDict.keys():
        db = context.serviceDBDict[dbKey]
    else:
        set_result("ERROR",   "<ERROR:没有找到数据库%s的配置,请联系管理员添加!>" % dbKey)
        return "<ERROR:没有找到数据库%s的配置>" % dbKey

    # paramList = splitStringToListByTag(strTobeProcessed, splitTag)

    if db.connect() == False:
        set_result("ERROR",   "<ERROR:service[%s]数据库连接异常>" % dbKey)
        return "<ERROR:service[%s]数据库连接异常>" % dbKey
    db.setCursorDict(True)

    # 判断影响行数
    if db.get_effected_rows_count(sqlstring.strip()) > 100:
        db.release()
        set_result("ERROR",  "<ERROR:DB_DELETE一次删除数据不得超过100行,请检查where子句。>")
        return "<ERROR:DB_DELETE一次删除数据不得超过100行,请检查where子句。>"

    res = db.execute_update_sql(sqlstring.strip())
    db.release()
    if isinstance(res,bool) and res == False:
        # check是否加了dbname.tablename
        fromTable = get_sub_string(sqlstring.strip().lower(), "from ", " where").strip()
        if fromTable and "." not in fromTable:
            set_result("ERROR","<ERROR:sql语句中的表名%s格式必须是database.table>" % fromTable)
            return "<ERROR:sql语句中的表名%s格式必须是database.table>" % fromTable
        else:
            set_result("ERROR","<ERROR:执行sql发生异常,请检查sql语句:%s>" % sqlstring.strip())
            return "<ERROR:执行sql发生异常,请检查sql语句:%s>" % sqlstring.strip()
    else:
        return str(res)
def db_select(*args):
    '''
    数据库查询
    :param args:参数可以是1个或者2个,1个的话就是sql语句,调用默认服务,2个的话第一个参数是数据服务key,第2个是sql语句。
    :return: sql查询的dict
    '''
    dbKey = "default"
    sqlstring = ""
    if len(args) == 1:
        sqlstring = args[0]
    elif len(args) == 2:
        dbKey = args[0]
        sqlstring = args[1]
    else:
        set_result("ERROR","执行db_select()时参数个数错误。")
        return "<ERROR:参数个数错误>"

    # 如果是更新或者删除或者插入操作,提示错误
    if sqlstring.strip().lower().startswith("update ") or sqlstring.strip().lower().startswith(
            "delete ") or sqlstring.strip().lower().startswith("insert "):
        set_result("ERROR","执行db_select()时只能使用SELECT语句。")
        return "<ERROR:只能使用SELECT语句>"

    if "delete " in sqlstring.strip().lower() or "update " in sqlstring.strip().lower() or "insert " in sqlstring.strip().lower():
        set_result("ERROR","执行db_select()时不能包含UPDATE/DELETE/INSERT操作!")
        return "<ERROR:不能包含UPDATE/DELETE/INSERT操作!>"

    if "where " not in sqlstring.strip().lower():
        set_result("ERROR","执行db_select()时必须包含where子句!")
        return "<ERROR:必须包含where子句!>"

    # 兼容旧的
    if not sqlstring.strip().lower().startswith("select "):
        set_result("ERROR","执行db_select()时开头必须是select!")
        return "<ERROR:使用db_select时,开头必须是select。>"

    if dbKey in context.serviceDBDict.keys():
        db = context.serviceDBDict[dbKey]
    else:
        set_result("ERROR","<ERROR:没有找到数据库%s的配置>" % dbKey)
        return "<ERROR:没有找到数据库%s的配置>" % dbKey

    # paramList = splitStringToListByTag(strTobeProcessed, splitTag)
    sqlstring = core.processor.CP.CP.getProcessedValue(sqlstring, context)
    if db.connect() == False:
        set_result("ERROR","<ERROR:service[%s]数据库连接异常>" % dbKey)
        return "<ERROR:service[%s]数据库连接异常>" % dbKey
    db.setCursorDict(True)

    # 判断影响行数
    if db.get_effected_rows_count(sqlstring.strip()) > 100:
        db.release()
        set_result("ERROR","<ERROR:DB_SELECT查询数据不得超过100行,请检查where子句。>")
        return "<ERROR:DB_SELECT查询数据不得超过100行,请检查where子句。>"

    res = db.execute_sql(sqlstring.strip())
    db.release()
    retList = []
    if isinstance(res,bool) and res == False:
        # check是否加了dbname.tablename
        fromTable = get_sub_string(sqlstring.strip().lower(), "from ", " where").strip()
        if fromTable and "." not in fromTable:
            set_result("ERROR","<ERROR:sql语句中的表名%s格式必须是database.table>" % fromTable)
            return "<ERROR:sql语句中的表名%s格式必须是database.table>" % fromTable
        else:
            set_result("ERROR","<ERROR:执行sql发生异常,请检查sql语句:%s>" % sqlstring.strip())
            return "<ERROR:执行sql发生异常,请检查sql语句:%s>" % sqlstring.strip()

    for tmpObj in res:
        tmpDict = {}
        for tmpK, tmpV in tmpObj.items():
            if isinstance(tmpV,datetime.datetime):
                # 如果是datetime类型的,无法转换为json,要先转换为字符串
                tmpDict[tmpK] = str(tmpV)
            elif isinstance(tmpV, decimal.Decimal):
                tmpDict[tmpK] = str(decimal.Decimal(tmpV))
            else:
                tmpDict[tmpK] = tmpV
        retList.append(tmpDict)
    return json.dumps(retList)