目录
在Python中,我们通常会用列表,字典,元组等数据类型来存储一些数据,但是当我们有大量的数据时,使用这些数据类型会比较麻烦,比如要进行写入,修改,查找等操作时,我们要进行大量的数据编辑,这时我们可以把Python结合数据库来使用,下面我们会介绍其内容。
一、数据库
1、数据库的概念
数据库可以用来存放大量的数据,并且提供了方便且快速的检索手段,且能够快速查找出符合某种条件的数据(比如所有身高在170cm以上的男生)
数据库可以是一个文件比如“c:/tmp/students.db”
2、数据库的表
一个数据库文件中,可以包含很多张表,比如在students.db的数据库文件中,包含学生信息表和学生课程表
而一个表由记录构成,比如在一个学生信息的表中,每一个记录,就代表一个学生的信息
而一个记录由字段构成,每个字段对应一个属性,一个记录中若包含多个字段,就是在表述这个事物的多个属性,比如拿出一个学生记录,可以由name(姓名),id(学号),age(年龄),gender(性别)等字段构成
3、字段详解
每一个字段都是有“类型”的,下面我们用一个学生信息表的例子来介绍一下:
字段名 | 数据类型 |
name(姓名) | text(字符串) |
gpa(成绩) | real(小数) |
age(年龄) | integer(整数) |
profile(用户资料) | text(字符串) |
photo(照片) | blob(二进制数据) |
birthday(生日) | date(日期,本质上就是text) |
register time(注册时间) | datetime(日期+时间,本质上就是text) |
二、SQL数据库语句
1、了解SQL命令
SQL命令是用来对数据库进行操作的标准语句,它支持多种数据库的操作
下面我们介绍几种常见的SQL命令(不区分大小写)
SQL命令 | 功能 |
CREATE TABLE | 创建一个表 |
INSERT INTO | 在表中插入记录 |
UPDATE | 在表中更新记录 |
SELECT | 在表中查询记录 |
DALETE | 从表中删除记录 |
2、CREATE命令
我们可以用CREATE命令来创建一个表:
例子:
CREATE TABLE if not exists students (id integer primary key , name text , gpa real , birthday date , age integer , picture blob)
这个命令会创建一个名为students的表,里面会包含许多种字段(绿色的字),而后面跟着的黑色的字就是其对应的数据类型,而第一个id后面的(primary key)表示不可重复
3、INSERT命令
我们可以用INSERT INTO 命令来插入一个记录
例子:
INSERT INTO students VALUES(001 , 'Sue' , 100 , '1900-01-01' , 19 , null)
这条命令在students表中插入了一个记录,该记录暂无照片,就用“null”表示
而VALUES是指该记录中每个字段的值是什么
三、数据库和SQL命令
下面我们把数据库和Python结合:
在结合的时候我们需要导入一个sqlite3的包:
我们来看一个简单的例子:
先在某目录下创建一个后缀是.db的数据库文件(也可以不创建,但是要在Python的代码中明确之处想要创建的文件的目录及名称)
创建完成后我们在Python的文件中创建对数据库执行操作的代码:
import sqlite3
db = sqlite3.connect("D:\学习\Python\students.db") #连接数据库,若不存在则自动创建
cur = db.cursor() #获取光标,操作数据库一般需要通过光标来进行
sql = "CREATE TABLE if not exists students (id integer primary key , name text , gpa real , birthday date , age integer )" #创建一个students的表。如果不存在就创建它
cur.execute(sql) #通过光标来执行上面的SQL命令
cur.execute("INSERT INTO students VALUES(1001 , 'Sue' , 100 , '1900-01-01' , 19 , 1 )") #插入一个记录
mylist = [(1002 , 'Lua' , 98 , '1900-01-02' , 99.5 , 1) , (1003 , 'Don' , 88.5 , '1999-02-18' , 67 , 1)]
for i in mylist : #可把列表中的每个元素都遍历一遍,然后把这些数据依次插入到students表中
cur.execute('INSERT INTO students VALUES(?,?,?,?,?,?)' , (i[0] , i[1] , i[2] , i[3] , i[4] , i[5])) #“ ?”对应这后面的每一项i[x],证明是可变变量
db.commit() #执行这条语句,才能真正的把上面那些操作完成
cur.close() #关闭光标
db.close() #关闭数据库
执行后,我们可以用SQLite软件来查看:
可以发现我们的成功的创建了students这个表,并且插入了相关的记录
四、数据库的查询与修改
1、SELECT命令
SELECT命令是一个十分强大的命令,它可以根据你的要求去筛选记录:
下面是一些例子:
①:SELECT * FROM students
检索表students表中的全部记录
( * 代表查询所要求的记录的全部字段 )
②:SELECT * FROM students ORDER BY age
检索表students表中的全部记录,并按年龄排序
③:SELECT name , age FROM students
检索表students表中的全部记录,但每个记录只取name和age字段
④:SELECT * FROM students WHERE name = " Sue "
检索表中全部name字段为“Sue”的记录
(WHERE 代表检索条件)
⑤:SELECT * FROM students WHERE name = "Sue" AND age > 20 ORDER BY age DESC
检索表中name字段是“Sue”,且年龄大于20的人,并且结果按年龄的降序排序
下面我们根据上面已经创建好的数据库文件,来进行一个筛选:
import sqlite3
db = sqlite3.connect("D:\学习\Python\students.db") #连接数据库
cur = db.cursor() #创建光标
sql = 'SELECT * FROM students WHERE age < 50' #要执行的SQL语句
cur.execute(sql) #执行SQL语句
x = cur.fetchall() #获取SQL语句操作后,得到的结果
if x != [] :
print("符合条件的共有:" , len(x))
for i in x :
print(i)
cur.close() #关闭光标
db.close() #关闭数据库
我们想要筛选数据库中年龄小于50的记录
输出:
2、UPDATE命令
①UPDATE students SET age = 18
把所有记录的age都改成18
②UPDATE students SET , gpa = 88 , age = 99 WHERE name = "Don"
修改name = Don 的gpa字段和age字段
例子:
import sqlite3
db = sqlite3.connect("D:\学习\Python\students.db") #连接数据库
cur = db.cursor() #创建光标
sql = 'UPDATE students SET age = ? WHERE name = ?' #要执行的SQL语句
cur.execute(sql , (1, "Don")) #执行SQL语句,元组中的两个元素对应上面的两个?(若Don不存在,则无效果)
db.commit() #只要改变了数据库的数据就必须执行这个!!!
cur.close() #关闭光标
db.close() #关闭数据库
我们回到数据库的表中,发现Don的年龄被改成了1(神秘返老还童术):
3、DELETE命令
①DELETE FROM students WHERE age <18
删除年龄小于18的记录
②DELETE FROM students
删除全部记录
4、DROP TABLE
DROP TABLE IF EXISTS students
删除students表
(这个操作最后也需要commit)
5、SQL的注意事项
对于修改表的操作:如插入,删除,更新,在关闭数据库前不要忘记commit!否则可能无效
五、处理二进制字段
把图片放入数据库
import sqlite3
import requests #网络请求
db = sqlite3.connect("D:\学习\Python\students.db")
cur = db.cursor()
imgURL = "https://img5.duitang.com/uploads/item/201605/19/20160519224441_VFMWR.jpeg"
imgStream = requests.get(imgURL, stream = True) #stream=True 参数告诉 requests 库以流式传输(streaming)的方式获取数据,而不是一次性将所有内容下载到内存中
sql = "UPDATE students SET picture = ? WHERE name = 'Don'"
cur.execute(sql , (imgStream.content , )) #注意元组最后需要有一个逗号
db.commit()
cur.close()
db.close()
补充:
f = open (r"D:\学习\Python\001.jpg" , "rb") #字符串之前的r是把字符串内的任何特殊字符数字均看成字符,后面的rb的r是读取,b是二进制
以上就是Python与数据库的全部内容:)