最近想做一个人脸相册,需要用到数据库。python内置有sqlite3,可以直接使用,不用安装。
首先说一下数据库的几个基本概念:
table(表)是数据库中存放数据的集合,一个数据库里面包含多张表,比如我要设计的数据库里面,包含image table, face table, person table。表和表之间用外键(foreign key)关联, 比如在我的例子中,外键是: image_id, person_id, face_id.
要操作数据库,首先需要连接到数据库,一个数据库的连接称为connection
链接到数据库后,需要打开游标(cursor), 通过cursor执行SQL语句,然后获得执行结果。上面那个例子,用SQL语句
SQL语句
这部分我看了W3School的基础教程,很快就看完了
SQL (结构化查询语言)语句,对大小写不敏感,分为- data manage language (DML)数据操作语言
- 包括查询和更新
SELECT 从数据库表中获取数据
SELECT 列名称 FROM 表名称
SELECT * FROM 表名称
SELECT DISTINCT 列名称 FROM 表名称
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
SELECT * FROM Persons WHERE City='Beijing'
,SQL 的文本值用单引号AND OR
`SELECT * FROM Persons WHERE (FirstName=’Thomas’ AND LastName=’Carter’)ORDER NY (DESC
SELECT Company, OrderNumber FROM myTable ORDER BY Company DESC, number ASC
DELETE 从数据库表中删除数据
DELETE FROM 表名称 WHERE 列名称 = 值
一整行的数据被删除DELETE * FROM 表名称
不删除表的情况下删除所有的行。意味着表的结构、属性和索引都是完整的.
- INSERT INTO 向数据库表中插入数据
- 向表中插入新的一行数据
INSERT INTO 表名称 VALUES ('Chunying', 'female', '24', 'Shanghai')
- 向指定的列中插入数据
INSERT INTO 表名称 (Name, gender) VALUES ('Neo', 'male')
这样,只填了这两列
- 向表中插入新的一行数据
- UPDATE 用于修改表中的数据,比如的硕士的,起薪10k
UPDATE 表名称 SET 列1 = 新值 WHERE 列2 = 某值
,比如UPDATE 表名称 SET age = 23, city='Shanghai' WHERE Name = 'Neo'
这样把上面那空的两列补上了
- data definition language (DDL) 数据定义语言
- CREATE DATABASE 创建新数据库
- ALTER DATABASE 修改数据库
- CREATE TABLE 创建新表
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
- ALTER TABLE 变更(改变)数据库表
- DROP TABLE 删除表
- CREATE INDEX 创建索引(搜索键)
- DROP INDEX 删除索引
下面是我写个一个小例子,3个表, Image, Person, Face
import sqlite3
conn = sqlite3.connect('face.db')
print ("Opened database successfully")
def creat_Image_table(conn):
sql='''
CREATE TABLE Image(
Image_id int,
Image_name varchar(50),
Image_path varchar(255),
Image_date date
);
'''
conn.execute(sql)
def creat_Person_table(conn):
sql='''
CREATE TABLE Person(
Persion_id int,
Person_name varchar(50),
Person_birthdate date,
Person_gender int(1)
);
'''
conn.execute(sql)
def creat_Face_table(conn):
sql='''
CREATE TABLE Face(
Face_id int,
Face_feature BLOB,
Face_person_id int,
Face_image_id int
);
'''
conn.execute(sql)