Flask(flask_sqlalchemy)使用原生sql封裝


app.py

from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy()

新建一個py文件db_seeson.py

from init import db

def fetch_to_dict(sql, params={}, fecth='all', bind=None):
    '''
    dict的方式返回數據
    :param sql: select * from xxx where name=:name
    :param params:{'name':'zhangsan'}
    :param fecth:默認返回全部數據,返回格式為[{},{}],如果fecth='one',返回單條數據,格式為dict
    :param bind:連接的數據,默認取配置的SQLALCHEMY_DATABASE_URL,
    :return:
    '''
    resultProxy = db.session.execute(sql, params, bind=db.get_engine(bind=bind))
    if fecth == 'one':
        result_tuple = resultProxy.fetchone()
        if result_tuple:
            result = dict(zip(resultProxy.keys(), list(result_tuple)))
        else:
            return None
    else:
        result_tuple_list = resultProxy.fetchall()
        if result_tuple_list:
            result = []
            keys = resultProxy.keys()
            for row in result_tuple_list:
                result_row = dict(zip(keys, row))
                result.append(result_row)
        else:
            return None
    return result


# 分頁
def fetch_to_dict_pagetion(sql, params={}, page=1, page_size=15, bind=None):
    sql_count = """select count(*) as count from (%s) _count""" % sql
    total_count = get_count(sql_count, params, bind=bind)
    sql_page = '%s limit %s,%s' % (sql, (page - 1) * page_size, page_size)
    print('sql_page:', sql_page)
    result = fetch_to_dict(sql_page, params, 'all', bind=bind)
    result_dict = {'results': result, 'count': total_count}
    return result_dict


# 執行單條語句(update,insert)
def execute(sql, params={}, bind=None):
    print('sql', sql)
    db.session.execute(sql, params, bind=db.get_engine(bind=bind))
    db.session.commit()

def get_count(sql, params={}, bind=None):
return int(fetch_to_dict(sql, params, fecth='one', bind=bind).get('count'))

# 執行多條語句,失敗自動回滾 def execute_many(sqls): print(sqls) if not isinstance(sqls, (list, tuple)): raise Exception('type of the parameters must be list or tuple') if len(sqls) == 0: raise Exception("parameters's length can't be 0") for statement in sqls: if not isinstance(statement, dict): raise Exception("parameters erro") try: for s in sqls: db.session.execute(s.get('sql'), s.get('params'), bind=db.get_engine(bind=s.get('bind', None))) db.session.commit() except Exception as e: db.session.rollback() raise Exception("execute sql fail ,is rollback")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM