Discuss / Python / 练习题有个小坑,还是搞定了

练习题有个小坑,还是搞定了

Topic source

先上代码

import os
import sqlite3

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

# init
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
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)")

def get_score_in(low, high):
    cursor.execute('select name from user where score>=? and score<=? order by score', (low, high))
    # 下面取出的是元组组成的列表:[('Bart',), ('Lisa',), ('Adam',)],要再循环遍历一次取出列表值
    names = cursor.fetchall()
    return [x[0] for x in names]

# test
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!')

cursor.close()
conn.commit() # 这句可有可无吧,同一个数据库连接里面不影响
conn.close()

坑在注释里面解释了。 有个小问题,conn.commit()这句到底干嘛的,官方文档说如果不运行这句,在其他数据库连接里面,刚才的数据库操作就不可见。意思是不运行这句数据库操作就没有写入吗??? 这里我是同一个数据库连接所以不影响结果???

BurNing_Zz

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

如果有写操作的话就要用conn.commit(),这句代码是说在关闭连接前保存对数据库的修改,如果只是读操作的话就没有必要用这句话了。你的代码在建表插入后conn并没有关闭,你可以理解为数据还在缓存中,所以你后面的查询操作就可以查到,如果你在查询之前关闭连接而且没有写conn.commit()的话,后面再建立连接查询是查不到的,因为你之前插入的数据没有保存。


  • 1

Reply