python中sqlite3的基础操作

这篇博客详细介绍了如何在Python环境中安装和使用sqlite3库。内容包括数据库的安装、128维特征向量的存储、数据表的创建与插入、数据的更新和删除。示例代码展示了如何处理人脸检测数据,并将其存储到sqlite3数据库中,为后续人脸识别和聚类提供基础。
部署运行你感兴趣的模型镜像

上一博客中

https://blog.youkuaiyun.com/reset2021/article/details/119209553中讲述了怎样通过dlib实现人脸的特征检测,以及特征描述,获取人脸对应的128维向量。

这一篇文章主要讲述一下通过sqlite3实现对上述特征向量的保存。

1、sqlite3的安装

首先查询一下是否已经安装了sqlite3,在python环境下输入如下命令:

import sqlite3

如果没有安装的话,需要先进行编译,然后重新安装相应的python版本,具体操作可以参考如下连接,有详细的安装说明

https://www.cnblogs.com/setname/p/8496990.html

2、在上一博客中获取到图像中人脸的128维特征向量。

为后续人脸识别与人脸聚类的需要,所以采用sqlite3数据库对上述获取的128维向量进行存储。

2.1、数据库,数据表的创建

下列代码中首先判断数据库文件是否已经存在,如果存在,则直接进行连接,如果不存在的话,则进行数据库与数据表的创建。

    if os.path.exists(dbpath):
        message = 'OK, the db file exists.'
        con = sqlite3.connect(dbpath)
        cur = con.cursor()
    else:
        con = sqlite3.connect(dbpath)
        cur = con.cursor()
        createsql = "create table " + tablename + "(SNO char(10) UNIQUE primary key,Spath char(200), P1 REAL, P2 REAL, P3 REAL, P4 REAL, P5 REAL, P6 REAL, P7 REAL, P8 REAL \
        , P9 REAL, P10 REAL, P11 REAL, P12 REAL, P13 REAL, P14 REAL, P15 REAL, P16 REAL \
        , P17 REAL, P18 REAL, P19 REAL, P20 REAL, P21 REAL, P22 REAL, P23 REAL, P24 REAL \
        , P25 REAL, P26 REAL, P27 REAL, P28 REAL, P29 REAL, P30 REAL, P31 REAL, P32 REAL \
        , P33 REAL, P34 REAL, P35 REAL, P36 REAL, P37 REAL, P38 REAL, P39 REAL, P40 REAL \
        , P41 REAL, P42 REAL, P43 REAL, P44 REAL, P45 REAL, P46 REAL, P47 REAL, P48 REAL \
        , P49 REAL, P50 REAL, P51 REAL, P52 REAL, P53 REAL, P54 REAL, P55 REAL, P56 REAL \
        , P57 REAL, P58 REAL, P59 REAL, P60 REAL, P61 REAL, P62 REAL, P63 REAL, P64 REAL \
        , P65 REAL, P66 REAL, P67 REAL, P68 REAL, P69 REAL, P70 REAL, P71 REAL, P72 REAL \
        , P73 REAL, P74 REAL, P75 REAL, P76 REAL, P77 REAL, P78 REAL, P79 REAL, P80 REAL \
        , P81 REAL, P82 REAL, P83 REAL, P84 REAL, P85 REAL, P86 REAL, P87 REAL, P88 REAL \
        , P89 REAL, P90 REAL, P91 REAL, P92 REAL, P93 REAL, P94 REAL, P95 REAL, P96 REAL \
        , P97 REAL, P98 REAL, P99 REAL, P100 REAL, P101 REAL, P102 REAL, P103 REAL, P104 REAL \
        , P105 REAL, P106 REAL, P107 REAL, P108 REAL, P109 REAL, P110 REAL, P111 REAL, P112 REAL \
        , P113 REAL, P114 REAL, P115 REAL, P116 REAL, P117 REAL, P118 REAL, P119 REAL, P120 REAL \
        , P121 REAL, P122 REAL, P123 REAL, P124 REAL, P125 REAL, P126 REAL, P127 REAL, P128 REAL);"
        cur.execute(createsql)

上述代码中,dbpath为数据库文件的路径,tablename为数据表的名称。上述语句创建了一个名为tablename的数据表,其中数据表中包含一个主键,一个Spath(图片的路径),P1~P128共130个元素,其中,P1~P128用于存储人脸的128维向量。

2.2、数据库的插入

通过对人脸的相关数据进行处理,保证图像人脸路径与特征向量一一对应。执行如下命令,实现人脸与特征数据的插入操作。

try:
    #在这里,“需要插入的数据”默认以独立的str形式(在列表中)存储。利用列表下标的索引方式一一加入到execute中去。
    sql_insert = "INSERT INTO " + tablename +" VALUES"   #SQL语句一
    sql_values = ""     #SQL语句二
    for i in range(0,len(imagefiles)):   #列表下标索引,一一提取一行数据
        sql_values += '('                       #增加execute语句所需的左括号
        sql_values += str(i+1)
        sql_values += ","
        sql_values += "'{}'".format(imagefiles[i])     #插入数据
        tmepdes = descriptors[i]
        sql_values += ","
        for j in range(0,len(tmepdes)):#插入数据
            sql_values += str(tmepdes[j])  
            if (j < len(tmepdes) - 1):
                sql_values += "," 
        sql_values += '),'                      #右括号
    sql_values = sql_values.strip(',')          #去除最后一行数据的逗号,也可replace为分号
    sql_todo = sql_insert + sql_values          #两个SQL分语句合并

     #插入动作的执行。若要改变“需要插入的数据”,直接改存储数据的列表即可。
    cur.execute(sql_todo)
    con.commit()
    print('插入成功')
except Exception as e:
    print(e)
    print('插入失败')
    con.rollback()
finally:
    # 关闭游标
     cur.close()
# 关闭连接
con.close()

上述代码中,imagefiles为人脸对应的图像路径,descriptors为128维向量的集合。

2.3、数据的更新

新增加的图片,经过特征检测与特征描述后,可以通过以下代码来实现数据库的增量。

if os.path.exists(dbpath):
    message = 'OK, the db file exists.'
    con = sqlite3.connect(dbpath)
    cur = con.cursor()
else:
    con = sqlite3.connect(dbpath)
    cur = con.cursor()
   
createsql = "create table IF NOT EXISTS " + tablename + "(SNO char(10) UNIQUE primary key,Spath char(200), P1 REAL, P2 REAL, P3 REAL, P4 REAL, P5 REAL, P6 REAL, P7 REAL, P8 REAL \
    , P9 REAL, P10 REAL, P11 REAL, P12 REAL, P13 REAL, P14 REAL, P15 REAL, P16 REAL \
    , P17 REAL, P18 REAL, P19 REAL, P20 REAL, P21 REAL, P22 REAL, P23 REAL, P24 REAL \
    , P25 REAL, P26 REAL, P27 REAL, P28 REAL, P29 REAL, P30 REAL, P31 REAL, P32 REAL \
    , P33 REAL, P34 REAL, P35 REAL, P36 REAL, P37 REAL, P38 REAL, P39 REAL, P40 REAL \
    , P41 REAL, P42 REAL, P43 REAL, P44 REAL, P45 REAL, P46 REAL, P47 REAL, P48 REAL \
    , P49 REAL, P50 REAL, P51 REAL, P52 REAL, P53 REAL, P54 REAL, P55 REAL, P56 REAL \
    , P57 REAL, P58 REAL, P59 REAL, P60 REAL, P61 REAL, P62 REAL, P63 REAL, P64 REAL \
    , P65 REAL, P66 REAL, P67 REAL, P68 REAL, P69 REAL, P70 REAL, P71 REAL, P72 REAL \
    , P73 REAL, P74 REAL, P75 REAL, P76 REAL, P77 REAL, P78 REAL, P79 REAL, P80 REAL \
    , P81 REAL, P82 REAL, P83 REAL, P84 REAL, P85 REAL, P86 REAL, P87 REAL, P88 REAL \
    , P89 REAL, P90 REAL, P91 REAL, P92 REAL, P93 REAL, P94 REAL, P95 REAL, P96 REAL \
    , P97 REAL, P98 REAL, P99 REAL, P100 REAL, P101 REAL, P102 REAL, P103 REAL, P104 REAL \
    , P105 REAL, P106 REAL, P107 REAL, P108 REAL, P109 REAL, P110 REAL, P111 REAL, P112 REAL \
    , P113 REAL, P114 REAL, P115 REAL, P116 REAL, P117 REAL, P118 REAL, P119 REAL, P120 REAL \
    , P121 REAL, P122 REAL, P123 REAL, P124 REAL, P125 REAL, P126 REAL, P127 REAL, P128 REAL);"
    #print(createsql)
cur.execute(createsql)

selectsql = "select * from " + tablename
cur.execute(selectsql)

#cur.execute("select * from tablename")
rows = cur.fetchall()
lastsize = 0
if  len(rows) > rows[-1][0]:
    lastsize = len(rows)
else:
    lastsize = int(rows[-1][0])



try:
    #在这里,“需要插入的数据”默认以独立的str形式(在列表中)存储。利用列表下标的索引方式一一加入到execute中去。
    sql_insert = "INSERT INTO " + tablename +" VALUES"   #SQL语句一
    sql_values = ""     #SQL语句二
    for i in range(0,len(imagefiles_update)):   #列表下标索引,一一提取一行数据
        sql_values += '('                       #增加execute语句所需的左括号
        sql_values += str(lastsize + i + 1)
        sql_values += ","
        sql_values += "'{}'".format(imagefiles_update[i])     #插入数据
        tmepdes = descriptors_update[i]
        sql_values += ","
        for j in range(0,len(tmepdes)):#插入数据
            sql_values += str(tmepdes[j])  
            if (j < len(tmepdes) - 1):
                sql_values += "," 
        sql_values += '),'                      #右括号
    sql_values = sql_values.strip(',')          #去除最后一行数据的逗号,也可replace为分号
    sql_todo = sql_insert + sql_values          #两个SQL分语句合并
    #print(sql_todo)

     #插入动作的执行。若要改变“需要插入的数据”,直接改存储数据的列表即可。
    cur.execute(sql_todo)
    con.commit()
    print('插入成功')
except Exception as e:
    print(e)
    print('插入失败')
    con.rollback()
finally:
    # 关闭游标
     cur.close()
# 关闭连接
con.close()

上述代码中,首先判断数据库的存在与否,如果不存在则进行新建;然后对数据库进行查询,获取SNO值,新增得数据需要在SNO上递增,以保证SNO数据的唯一性。然后通过sql命令实现数据的增量操作。

注意:这里的数据的更新其实是实现数据的新增。与常规的更新是有所区别的,常规的更新是针对数据项的更改,由于这里暂时还没涉及到对数据项的更改,所以就不在这里进行描述啦。

2.4、数据的删除

在本应用中,主要涉及到的是对图像相关数据的删除,具体操作见如下代码

if os.path.exists(dbpath):
    message = 'OK, the db file exists.'
    con = sqlite3.connect(dbpath)
    cur = con.cursor()
    
    selectsql = "select * from "+tablename
    cur.execute(selectsql)
    #cur.execute("select * from tablename")
    count = cur.fetchall()
    
    if(count):
        try:
            #在这里,“需要插入的数据”默认以独立的str形式(在列表中)存储。利用列表下标的索引方式一一加入到execute中去。
            sql_values = ""     #SQL语句二
            for i in range(0,len(imagefiles)):   #列表下标索引,一一提取一行数据
                sql_delete = "delete from " + tablename + " where Spath="   #SQL语句一
                sql_delete += "'{}'".format(imagefiles[i])                       #增加execute语句所需的左括号

                #插入动作的执行。若要改变“需要插入的数据”,直接改存储数据的列表即可。
                cur.execute(sql_delete)
                con.commit()
            print('删除成功')
        except Exception as e:
            print(e)
            print('删除失败')
            con.rollback()
        finally:
            # 关闭游标
            cur.close()
        # 关闭连接
        con.close()

else:
    print("there is no db file")

首先还是对数据库有无的判断,其次是通过传递图像路径数据,对该图像的所有数据进行删除操作。

总结:上述步骤结合实际应用简单地介绍了以下python当中sqlite3的基本应用,后续将针对这些数据库中存储的数据进行后续相关处理。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reset2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值