Discuss / Python / 需要先看SQL教程才能把测试写出来

需要先看SQL教程才能把测试写出来

Topic source

alienation

#1 Created at ... [Delete] [Delete and Lock User]

发现网站里的个人资料只有最新帖子,旧的帖子会被挤掉找不到。。。。

# -*- coding: utf-8 -*-
# 请编写函数,在Sqlite中根据分数段查找指定的名字:
import os, sqlite3

db_file = os.path.join(os.path.dirname(__file__), 'test.db')
if os.path.isfile(db_file):
    os.remove(db_file)

# 初始数据:
# 第一步:建立数据库并创建游标
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
# 第二步:通过游标,对数据库执行操作游标.execute(内部为以字符串表示的各种操作(内部为操作本身所要求的的参数))
cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
# 第三步:执行操作后需提交(是通过数据库对象的commit方法)
conn.commit()
# 第四步:关闭游标和数据库,资源泄露具体是指?
cursor.close()
conn.close()


def get_score_in(low, high):
    ' 返回指定分数区间的名字,按分数从低到高排序 '
    # 第一步:打开数据库,建立游标
    conn = sqlite3.connect('test.db')
    cursor = conn.cursor()
    # 第二步:按照分数大小,输出姓名、分数对
    cursor.execute('select name,score from user order by score')
    # 第三步:拿到结果集,返回为一个以元组为元素的列表对象,每个元组为数据库中的一个条目
    data = cursor.fetchall()
    print(data)
    # 第四步:先关闭游标和数据库
    cursor.close()
    conn.close()
    # 第五步:将数据格式化为判断所需的格式并返回
    L_user = [infor[0] for infor in data if low < infor[1] <= high]
    return L_user


# 测试:
assert get_score_in(80, 95) == ['Adam'], get_score_in(80, 95)
assert get_score_in(60, 80) == ['Bart', 'Lisa'], get_score_in(60, 80)
assert get_score_in(60, 100) == ['Bart', 'Lisa', 'Adam'], get_score_in(60, 100)

print('Pass')

方法二:先在数据库里筛选,然后在python对象里排序,用了sorted函数

def get_score_in(low, high):
    ' 返回指定分数区间的名字,按分数从低到高排序 '
    # 第一步:打开数据库,建立游标
    conn = sqlite3.connect('test.db')
    cursor = conn.cursor()
    # 第二步:查询参数对应的条目
    #cursor.execute('select name,score from user order by score')
    cursor.execute('select name,score from user where (score <= ? and score > ?)', (str(high), str(low)))
    # 第三步:拿到结果集,返回为一个以元组为元素的列表对象,每个元组为数据库中的一个条目
    data = cursor.fetchall()
    # 第四步:先关闭游标和数据库
    cursor.close()
    conn.close()
    # 第五步:将数据格式化为判断所需的格式并返回
    L = sorted(data, key=lambda x: x[1])
    L_user = [user[0] for user in L]
    return L_user

alienation

#2 Created at ... [Delete] [Delete and Lock User]

看了评论区,原来可以通过and把排序和限定范围两个条件同时使用,这样就不用再继续对python对象有过多操作了

年少的你

#3 Created at ... [Delete] [Delete and Lock User]

第五步是在做什么?

alienation

#4 Created at ... [Delete] [Delete and Lock User]

方法1是在筛选从sql中取出的符合范围的数据,然后排序

方法2是在对sql取出的已经内部筛好的数据排序

其实以上操作都可以在sql语句完成,评论区的这句sql就包含以上两步

cursor.execute('select name from user where score between ? and ? order by score',(low,high))

  • 1

Reply