最近将字典的数据Insert Into得到sqllite3报错,调试了好久才解决。系统开发完后,决心梳理下字典知识点。先解析一下遇到问题的这段代码:
import sqlite3 data = {"name": "张三", "sex": "男", "age": 20} # 要导入数据库的数据,数据类型为字典 dbpath = "./51job.db" #数据库表名 conn = sqlite3.connect(dbpath) # 连接数据库 cur = conn.cursor() # 创建游标对象 sql = ''' insert into test(name, sex, age ) values(%s)''' % ",".join("?" * len(data), )
# %s是占位符 , ?也是占位符,
# 这里注意,代表单个数值的占位符一定要用? len()在这里代表字典的键值对个数
cur.execute(sql, tuple(data.values(), )) # 执行sql语句;tuple(data.values(), )是将得到所有的值转换成元组 conn.commit() # 提交 cur.close() # 关闭游标 conn.close() # 关闭数据库连接
上面的问题虽然解决了,但是还是有些疑惑:比如,为什么插入数据的值在cur.execute()不能用data.values(),而是再转换成元组;",".join("?" * len(data), ) 和tuple(data.values(), )两处为什么加了",",这有什么作用?各位大佬如果看到这里可以帮忙解答下。
经过最近的一次开发,感觉数据类型转换这块知识点比较薄弱,趁此机会,好好梳理下字典。
本次按照增、删、改、查的逻辑方式对字典进行阐述
# 增 data = {'name': '张三', 'sex': '男', 'age': 20} dataInput = int(input("请输入您的ID:")) # 将输入的ID转换为int类型 data["id"] = dataInput print(data) # 输出为{'name': '张三', 'sex': '男', 'age': 20, 'id': 3},id新增成功
# 删 # del 删除字典中的某一键值对 data1 = {'name': '张三', 'sex': '男', 'age': 20, 'id': 3} print("删除前data1['id']为%d" % data1['id']) del data1['id'] print("删除后data['id']为%d" % data1['id']) # 删除了指定键值对后,再次访问会报错 # clear 清空字典 data2 = {'啤酒': '雪花纯生', '白酒': '宋河粮业', '红酒': '长城五星'} print("清空前data2['id']为%s" % data2) # 输出为:清空前data2['id']为{'啤酒': '雪花纯生', '白酒': '宋河粮业', '红酒': '长城五星'} data2.clear() print("清空后data2['id']为%s" % data2) # 输出为: 清空后data2['id']为{}
# 改 data = {'name': '张三', 'sex': '男', 'age': 20} print("修改前data['age']为%d" %data['age']) # 输出为:修改前data['age']为20 data['age'] = 28 print("修改后data为%s" % data) # 输出为:修改后data为{'name': '张三', 'sex': '男', 'age': 28}
# 查 data = {'name': '张三', 'sex': '男', 'age': 20} # 字典访问 print(data['name']) # 输出为: 张三 ''' 用data[键]获取值,如果该键值对不存在会报错, 此时可以使用data.get(键)来请求:若有该键值对,返回对应的值;若没有该键值对,默认返回None 另外,data.get(键, 自定义输出值) 表示若没有该键值对,输出值为自定义输出值 ''' print(data.get('name')) # 打印对应的值,输出为:张三 print(data.get('id')) # 没有该键值对,输出为:None print(data.get('id', '没有该键值对')) # 打印自定义输出值,输出为:没有该键值对 print(data.keys()) # 打印字典中全部的键(列表) 输出为:dict_keys(['name', 'sex', 'age']) print(data.values()) # 打印字典中全部的值(列表) 输出为:dict_values(['张三', '男', 20]) print(data.items()) # 得到所有的项(列表),每个键值对是一个元组 输出为:dict_items([('name', '张三'), ('sex', '男'), ('age', 20)]) print(tuple(data.keys())) # 打印字典中全部的键,将值转变为元组 输出为:('name', 'sex', 'age') print(tuple(data.values())) # 打印字典中全部的值,将值转变为元组 输出为:('张三', '男', 20) print(tuple(data.items())) # 将得到的所有项转变为元组,每个键值对是一个元组 输出为:(('name', '张三'), ('sex', '男'), ('age', 20)) # 遍历所有的键 for key in data.keys(): print(key) # 输出为: name sex age # 遍历所有的值 for values in data.values(): print(values) # 输出为: 张三 男 20 # 遍历所有的键值对 for keys, values in data.items(): print(keys, values) ''' 输出为: name 张三 sex 男 age 20 '''
知识拓展 用enumerate将列表遍历出键值对的效果
data = {'第一名', '第二名', '第三名'} for i,value in enumerate(data): # i为索引下标值 print(i+1, value) ''' 结果输出为: 1 第一名 2 第二名 3 第三名 '''