后端-排坑

后端排坑

一、SQL Server数据库

1. 时间字段的处理

1. CONVERT(VarChar(10), CREATE_TIME, 120)  
# 对于时间类型是datetime的字段的值,将其处理为年-月-日格式

2. CONVERT(VarChar(7), CREATE_TIME, 120)
# 对于时间类型是datetime的字段的值,将其处理为年-月格式

3. 数据库的时间字段可以直接用相同格式的字符串类型的时间进行比较(大于,小于,等于,赋值...)

2. 分组查询出每组数据的第N行的所有数据

(SELECT USER_ID,SUM_DURATION FROM 
( SELECT row_number() over(partition by user_id ORDER BY CREATE_TIME desc ) tn,* FROM SEODB.DBO.VIP_BUY_ORDER WHERE STATE=1 ) TB 
WHERE TB.tn=1  )  

# 表示以user_id 分组,以时间降序排序,查询出每个用户排序后的第一行数据
# tn, 后面的 * 为查询所有字段,可以随意更改,但需要注意的是最外层查询的字段在内层查询的字段中必须含有
# 注意筛选条件应该在 表名后面加,在TB.tn=1后面加条件是无用的

3. 数据库查询即时分页

# 原理: 从第多少行开始(不含开始的这一行), 再查询多少行,total_count为总数居条数
condition = ' 1=1 '
page = current_page - 1
page_size = 20

F""" SELECT WORD,NUM_BUYER,NUM_SELLER,CONVERT(VarChar(10), UPDATE_TIME, 120) AS DATE,total_count = COUNT(*) OVER() FROM solr.dbo.USER_VIP_SEAR WHERE {condition} order by UPDATE_TIME DESC, ID DESC offset {page} * {page_size} ROWS FETCH NEXT {page_size} ROWS ONLY"""

二、简单的分页器

这种分页器只适用于数据量较小的数据的分页(原理是将数据全部查询出来后进行切片)

class PaginationPost(object):
    def __init__(self, current_page, all_count, per_page_num=10, pager_count=5, url=''):
        """
        封装分页相关数据
        :param current_page: 当前页
        :param all_count:    数据库中的数据总条数
        :param per_page_num: 每页显示的数据条数
        :param pager_count:  最多显示的页码个数

        用法:
        queryset = model.objects.all()
        page_obj = Pagination(current_page,all_count)
        page_data = queryset[page_obj.start:page_obj.end]
        获取数据用page_data而不再使用原始的queryset
        获取前端分页样式用page_obj.page_html
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1

        if current_page < 1:
            current_page = 1
        self.url = url
        self.current_page = current_page

        self.all_count = all_count
        self.per_page_num = per_page_num

        # 总页码
        all_pager, tmp = divmod(all_count, per_page_num)
        if tmp:
            all_pager += 1
        self.all_pager = all_pager

        self.pager_count = pager_count
        self.pager_count_half = int((pager_count - 1) / 2)

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_num

    @property
    def end(self):
        return self.current_page * self.per_page_num

    def page_html(self):
        # 如果总页码 < 11个:
        if self.all_pager <= self.pager_count:
            pager_start = 1
            pager_end = self.all_pager + 1
        # 总页码  > 11
        else:
            # 当前页如果<=页面上最多显示11/2个页码
            if self.current_page <= self.pager_count_half:
                pager_start = 1
                pager_end = self.pager_count + 1

            # 当前页大于5
            else:
                # 页码翻到最后
                if (self.current_page + self.pager_count_half) > self.all_pager:
                    pager_end = self.all_pager + 1
                    pager_start = self.all_pager - self.pager_count + 1
                else:
                    pager_start = self.current_page - self.pager_count_half
                    pager_end = self.current_page + self.pager_count_half + 1

        page_html_list = []
        # 添加前面的nav和ul标签
        page_html_list.append('''
                    <nav aria-label='Page navigation>'
                    <ul class='pagination'>
                ''')
        first_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">首页</a></li>' % (self.url,1)
        page_html_list.append(first_page)

        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            prev_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">上一页</a></li>' % (self.url,self.current_page - 1,)

        page_html_list.append(prev_page)

        for i in range(pager_start, pager_end):
            if i == self.current_page:
                temp = '<li class="active"><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">%s</a></li>' % (self.url,i, i,)
            else:
                temp = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">%s</a></li>' % (self.url,i, i,)
            page_html_list.append(temp)

        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            next_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">下一页</a></li>' % (self.url,self.current_page + 1,)
        page_html_list.append(next_page)

        last_page = '<li><a onclick="page_data(\'%s?page=%s\')" style="cursor:pointer">尾页</a></li>' % (self.url,self.all_pager,)
        page_html_list.append(last_page)
        # 尾部添加标签
        page_html_list.append('''
                                           </nav>
                                           </ul>
                                       ''')
        return ''.join(page_html_list)
    
    
    
# 函数内部调用
@bp.route('/activity/2020-08/data', methods=['POST'])
@verify_logined
def activity_2020_08_data():
    data = g.restful.request('activity_2020_08_data', **request.form.to_dict())
    if data['state'] == 0:

        page_obj = Pagination(current_page=request.args.get('page', 1), all_count=len(data['data']),
                              url='/activity/2020-08/data')
        data['data'] = data['data'][page_obj.start:page_obj.end]
        data['page_html'] = page_obj.page_html()

    return jsonify(data)


# 前端页面的调用
<div class="my_page"></div>

$('.my_page').html(data.page_html);

// 点击页码事件
        function page_data(url) {
            $('.overlay').removeClass('none');
            $.ajax({
                url: url,
                type: 'post',
                dataType: 'json',
                data: params,
                success: function (pagedata) {
                    if (pagedata.state === 0) {
                        load_list(data.data, data.page_html)
                        $('.overlay').addClass('none');
                    }
                }
            })
        }

三、flask框架

1. 蓝图

2. flask开启多线程或多进程

flask只能开启多进程或多线程的其中一个, 开启多线程: app.run(threaded=True) ; 开启多进程:app.run(processes=大于1的数字) ,processes默认下为1,threaded默认下为False
注意: 在DEBUG值为True,即DEBUG环境下,开启多线程是无效的;windows环境下,flask不支持开启多进程。

四、python基础相关

1. 保留小数

  • round():低版本(3.6之前)的python解释器使用round()方法被除数为整形时,结果不会保留小数。解决方法:将被除数用float转成浮点型再做运算。使用round()方法的好处是会四舍五入

  • 格式化输出(不会四舍五入)

    • login_rate = '%.1f' % (curr_login_user['CURR_LOGIN_COUNT'] / all_diamond_user['DIAMOND_COUNT'] * 100)
      

五、 时间与字符串的转换

# 字符串转时间:
datetime.datetime.strptime(str_time,'%Y-%m-%d %H:%M:%S')

# 时间转字符串
datetime.datetime.strftime(now_time,'%Y-%m-%d %H:%M:%S')
posted @ 2020-09-03 18:13  BigSun丶  阅读(186)  评论(0)    收藏  举报