Bootstrap

关于Python的最小数据库sqlite3的调用,存储,读取

关于Python的最小数据库sqlite3的调用,存储,读取详解

Python的数据库模块有很多种。本人学习python的数据库也仅仅是看着网上的资料自学然后加工了一下,中间加了一些自己实验使用的小技巧,本人不是计算机专业的,但是希望能将自己做过的东西和大家分享。

这个是本人自己写的一个项目用到的数据库代码,亲测有效。我用的python版本为3.6.5,环境是windows。

首先概括下面会有的常用关系型数据库:SQLite、MySQL、PoesgreSQL、Oracle、SQL Server、 excel

SQLite:sqlite3。(python2.5+内置)
MySQL: MySQLdb
PoesgreSQL:postgresql_psycopg2()
Oracle: cx_Oracle
SQL Server: pymssql、pyodbc、adodbapi
excel: pyExcelertor
(引用自)> https://www.cnblogs.com/scofieldyu/p/5436104.html

这里我只讲下sqlite3的使用和技巧,毕竟sqlite3的使用已经够一般的常用功能,存储,创建,读取,查询。
高级的技巧在很高端的项目中运用的比较多,这里就不讲解了。

首先是sqlite3的简介。

简介:
SQLite3 可使用 sqlite3 模块与 Python 进行集成。sqlite3 模块是由 Gerhard Haring 编写的。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。您不需要单独安装该模块,因为 Python 2.5.x 以上版本默认自带了该模块。

自我对sqlite3的了解:
sqlite3这个模块也叫做最小数据库,在一般的Python的数据存储,读取,查询中比较常用,也被大多数程序员所青睐。使用简单,方便,语句短小,不需要像C++写数据库一样先要下载SQL Sever,不需要买本数据库的书去学习,只用在CMD的界面里下载sqlite3的模块,就是直接使用。

数据库简介:
数据库主要用来数据存储,读取,查询。要创建一个数据库,就要先创建一个数据的表,在表内写需要存的数据是什么。如:需要存入一个班级的人的信息,name,class,grade,score,等等。然后再规定存入的每个信息的数据类型,尽量存入的数据类型一致,不然容易出错。存储操作和查询操作类似,都是对表内的数据进行操作。

sqlite3的下载:

关于sqlite3的下载,我推荐用cmd的界面下载。
在这里插入图片描述
在windows的界面打开这个“运行”界面,然后输入cmd,点击确定。进入cmd的界面。

在这里插入图片描述

然后输入pip install sqlite3,回车,就开始自动下载了。如果出现识别不了的情况,就是电脑的python环境没有安装好,请参考其他的文章安装python 的系统环境变量。

当安装好sqlite3后,就可以开始使用了。下面我以一个自己做的项目的数据库做详解。

sqlite3的使用:
这里按照数据库的操作步骤讲解如何使用数据库。请按照1,2,3的顺序写数据库,当有3.1,3.2等序号时,为当前步骤可以进行各种其他的操作。如:3中可以创建或者存储或者查询,如果都需要操作可以单独写一个函数,也可以接着下面继续写需要的操作,但是连着写两个exeute的操作没有实验过,不能保证正确性,需要读者自己测试。

1、sqlite3数据库的创建:

在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。

import sqlite3
import pandas as pd
conn = sqlite3.connect('temp_wet_data.db')#这里命名一个conn的变量指向temp_wet_data.db的数据库文件,.db为数据库后缀。

2、创建数据库游标:
我们需要使用游标对象SQL语句创建,存储,查询数据库,获得对象。 通过以下方法来定义一个游标。

cursor = conn.cursor()#创建游标

游标用来对数据库中的数据进行操作,是最主要的一步,不论是创建数据库的表还是要读取数据库的数据,都要用游标操作。

游标的附录操作:
execute()–执行sql语句
executemany–执行多条sql语句
close()–关闭游标
fetchone()–从结果中取一条记录,并将游标指向下一条记录
fetchmany()–从结果中取多条记录
fetchall()–从结果中取出所有记录
scroll()–游标滚动

3、利用游标对数据库进行数据存储或者创建表或者查询数据操作。

3.1、创建表:
当创建好游标以后,就是要利用游标对数据库的表进行创建,没有表是不能查询到任何数据也存不了任何数据的,因此第一步就是要创建一个数据库内的表。

#执行一条SQL语句:创建user表
cursor.execute('create table user(date varchar(20) ,time varchar(20),chuanganqi varchar(20),bieming varchar(20),wendu varchar(20),shidu varchar(20))')
#这里创建了一个名字叫user的表,
#括号内date,time,chuangganqi,bieming,wendu,shidu都是要存的变量名。varchar(20)为变量类型。

关于括号内的语句,最后我再把我参考的资料贴上,可以翻到最后参考。

cursor.exeute就是执行一条sql语句,我基本用这条语句可以搞定所有的事情。
当创建好这个表后,要对事务进行提交,相当于进行一次保存。
保存代码:

conn.commit()

3.2、存储数据:
当数据库内有表的时候,就可以按照表的形式进行数据存储了。

cursor.execute("insert into user (date, time,chuanganqi,bieming,wendu,shidu) values('%s','%s','%s','%s','%s','%s')"% (shijian, time,chuanganqi,bieming,wendu,shidu))
            print('完成')
            conn.commit()

这里我全部存的%s的类型存进表格,因为表格创建的时候就是字符串的形式创建,因此,存储也要尽量相同。

3.3、查询:

数据库的数据查询有很多种,可以在一个范围内查询,可以根据某个名字查询,也可以查询所有的数据。

3.3.1、按某个变量的某个值查询:

当这个值和这个表中这个变量的位置存的数据值一样的时候,都会被查找出来。

cursor.execute("select * from user WHERE chuanganqi LIKE '%s'"%(chuanganqi))
#第一个chuanganqi为表中的变量名,第2个为需要查找的值。

这里我查的是chuanganqi的值,这里需要有一个变量传入,如:当要查询chuanganqi这列中的所有写的’a’的值的列时,

cursor.execute("select * from user WHERE chuanganqi LIKE '%s'"%(’a‘))

同时也可以进行模糊查询,

_x:找到以x结尾,并且x前面只有一个字符的数据,有几个_代表有几个数据
x_:找到以x开头,后面只有一个字符的数据
x%:找到所有以x结束的数据
%x:找到所有以x开头的数据
%x%:找到所有包含x的数据
具体来操作一下:找到所有name以C开头的数据:
cursor.execute('select * from user WHERE chuanganqi LIKE "C_"')
result=cursor.fetchall()
print(result)

3.3.2、按一定范围查询:

当给出一定的范围的时候,可以在一定的范围内查找sql表内某个列中存的数据。

cursor.execute("select  * from user where date>='%s' and date<='%s' and chuanganqi='%s'"%(date_s,date_e,shebei))
#这里的select  *的意思是得到所有的关于后面条件的所有数据。
#date>='%s' and date<='%s'为我的条件,date为创建表时定义的某个变量,这里是一个日期的列。%s为要代入的字符串。
#(date_s,date_e,shebei)为我要带入的字符串的名字。这里的
date_s=‘2019-04-03’
date_e=‘2019-04-04’
#shebei为我要查询的在这段时间内同时chuanganqi等于某个值时的条件,如果只要查某个范围内的话,这句可以不要。
shebei=‘001’


3.3.3、还有一种查询某个值的查询的语句:

cursor.execute('select * from user where wendu=?', (-256,))
#这里查询的是wendu为某个值的时候所有的数据。-256为我的wendu的数据。

3.3.4、查询后的读取出来:

当查询后,就要把数据读取出来,读取操作:

values = cursor.fetchall()
print(values)

这样就读取到values里了。
注意:
读取出来的值为nonetype,如果是读取操作是写在一个函数内,返回的一定什么都返回不了。如果要把nonetype类型的数据转换成有用的数据,就要在return()前写转换语句,如:

return(str(values))

3.4、关闭数据库。
关闭数据库前要先关闭游标,在关闭数据库。

cursor.close()
conn.close() 

4、番外:
如果要读取所有的内容:

cursor.execute("select  * from user ")
values = cursor.fetchall()
return(values)

下面是我的所有的完整代码:

import sqlite3
import pandas as pd
import datetime
def sql_to_list(s):#将sql的数据转成list型的函数
    
    r=[]
    a=s.replace(' " ', '').replace('[', '').replace(')', '').replace('(', '').replace('"', '').replace(']', '').strip().split(', ')
    #print((a))
    for i in range(len(a)):
        a[i]=a[i][1:len(a[i])-1]
    #print(a)
    for i in range(int(len(a)/6)):
        q=[]
        q.append(a[i*6])
        q.append(a[i*6+1])
        q.append(a[i*6+2])
        q.append(a[i*6+3])
        q.append(a[i*6+4])
        q.append(a[i*6+5])
        #print([q])
        r.extend([q])
    return(r)
def sql_create():
    #连接到SQlite数据库
    #数据库文件是temp_wet_data.db,不存在,则自动创建
    conn = sqlite3.connect('temp_wet_data.db')
    #创建一个cursor:
    cursor = conn.cursor()
    #执行一条SQL语句:创建user表
    cursor.execute('create table user(date varchar(20) ,time varchar(20),chuanganqi varchar(20),bieming varchar(20),wendu varchar(20),shidu varchar(20))')
    #插入一条记录:
    #cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
    #cursor.execute('insert into user (id, name) values (\'2\', \'sims\')')
    #cursor.execute('insert into user (id, name) values (\'3\', \'sims\')')
    #通过rowcount获得插入的行数:
    #print(cursor.rowcount) #reusult 1
    #关闭Cursor:
    cursor.close()
    #提交事务:
    conn.commit()
    #关闭connection:
    conn.close()
def sql_save(shijian,time,chuanganqi,bieming,wendu,shidu):#插入一个数据
    
        print('开始')
        #数据库文件是test.db,不存在,则自动创建
        conn = sqlite3.connect('temp_wet_data.db')
    #创建一个cursor:
        try:
            cursor = conn.cursor()
            print('准备')
            #"insert into cname(id,name,age)values(%d,'%s',%d)" % (sline['id'],sline['name'],sline['age'])
            cursor.execute("insert into user (date, time,chuanganqi,bieming,wendu,shidu) values('%s','%s','%s','%s','%s','%s')"% (shijian, time,chuanganqi,bieming,wendu,shidu))
            print('完成')
            conn.commit()
        
            print("存储成功。")
    #执行查询语句:
    #cursor.execute('select *from user where name=?', ('sims',))
    #使用featchall获得结果集(list)
    #values = cursor.fetchall()
    #print(len(values))
    #print(values) #result:[('1', 'Michael')]
    #关闭cursor
    #关闭conn
            cursor.close()
            conn.close()
        except:
            cursor = conn.cursor()
            cursor.execute('create table user(date varchar(20) ,time varchar(20),chuanganqi varchar(20),bieming varchar(20),wendu varchar(20),shidu varchar(20))')
            cursor.execute("insert into user (date, time,chuanganqi,bieming,wendu,shidu) values('%s','%s','%s','%s','%s','%s')"% (shijian, time,chuanganqi,bieming,wendu,shidu))
            cursor.close()
            #提交事务:
            conn.commit()
            #关闭connection:
            conn.close()
            print('已创建,存储')
def sql_search_shebei(chuanganqi):
        #数据库文件是test.db,不存在,则自动创建
    conn = sqlite3.connect('temp_wet_data.db')
    try:
        try:
            #创建一个cursor:
            cursor = conn.cursor()
            #执行查询语句:
            try:
                cursor.execute("select * from user WHERE bieming LIKE '%s'"%(chuanganqi))
            except:
                pass
            try:
                cursor.execute("select * from user WHERE chuanganqi LIKE '%s'"%(chuanganqi))
            except:
                pass
            
            #cursor.execute('select *from user where chuanganqi=?', ('001',))
            #cursor.execute("select name from user where score>=? and score<=? order by score ASC", (low,high))
            #使用featchall获得结果集(list)
            values = cursor.fetchall()
            #print(len(values))
            #print(values) #result:[('1', 'Michael')]
            cursor.close()
            conn.close()
            x=sql_to_list(str(values))
            return(x)
        
        except:
            cursor.execute('create table user(date varchar(20),time varchar(20),chuanganqi varchar(20),bieming varchar(20),wendu varchar(20),shidu varchar(20))')
            conn.commit()
            #关闭cursor
            #关闭conn
            cursor.close()
            conn.close()
    except:
        print("创建失败")
def sql_search_date_shebei(date_s,date_e,shebei):
        #数据库文件是test.db,不存在,则自动创建
    conn = sqlite3.connect('temp_wet_data.db')
    try:
        try:
            #创建一个cursor:
            cursor = conn.cursor()
            #执行查询语句:
            #cursor.execute("select * from user WHERE chuanganqi LIKE '%s'"%(chuanganqi))
            #cursor.execute('select *from user where chuanganqi=?', ('001',))
            cursor.execute("select  * from user where date>='%s' and date<='%s' and chuanganqi='%s'"%(date_s,date_e,shebei))
            #cursor.execute("select  wendu  from user where date>=? and date<=? order by date ASC", (date_s,date_e))
            #使用featchall获得结果集(list)
            values = cursor.fetchall()
            #print(len(values))
            #print(values) #result:[('1', 'Michael')]
            #关闭cursor
            #关闭conn
            cursor.close()
            conn.close()
            x=sql_to_list(str(values))
            return(x)
        except:
            cursor.execute('create table user(date varchar(20),time varchar(20),chuanganqi varchar(20),bieming varchar(20),wendu varchar(20),shidu varchar(20))')
            conn.commit()
            #关闭cursor
            #关闭conn
            cursor.close()
            conn.close()
    except:
        print("创建失败")
def sql_search_date_shebei_one(date,shebei):
    st=datetime.datetime.strptime(date, "%Y-%m-%d")
    
    et=(st)
    st=st-datetime.timedelta(days=1)
    st=st.strftime("%Y-%m-%d %H:%M:%S")
    et=et.strftime("%Y-%m-%d %H:%M:%S")
    #print(st,et)
    s=sql_search_date_shebei(st,et,shebei)
    return(s)
def sql_search_date(date_s,date_e):
        #数据库文件是test.db,不存在,则自动创建
    conn = sqlite3.connect('temp_wet_data.db')
    try:
        try:
            #创建一个cursor:
            cursor = conn.cursor()
            #执行查询语句:
            #cursor.execute("select * from user WHERE chuanganqi LIKE '%s'"%(chuanganqi))
            #cursor.execute('select *from user where chuanganqi=?', ('001',))
            cursor.execute("select  * from user where date>='%s' and date<='%s' "%(date_s,date_e))
            #cursor.execute("select  wendu  from user where date>=? and date<=? order by date ASC", (date_s,date_e))
            #使用featchall获得结果集(list)
            values = cursor.fetchall()
            #print(len(values))
            #print(values) #result:[('1', 'Michael')]
            #关闭cursor
            #关闭conn
            cursor.close()
            conn.close()
            #print(values)
            x=sql_to_list(str(values))
            return(x)
        except:
            cursor.execute('create table user(date varchar(20),time varchar(20),chuanganqi varchar(20),bieming varchar(20),wendu varchar(20),shidu varchar(20))')
            conn.commit()
            #关闭cursor
            #关闭conn
            cursor.close()
            conn.close()
    except:
        print("创建失败")
def sql_search_all():#查询所有的文件
    conn = sqlite3.connect('temp_wet_data.db')
    try:
        try:
            cursor = conn.cursor()
            cursor.execute("select  * from user ")
       
            values = cursor.fetchall()
            #print(len(values))
            #print(values)
            cursor.close()
            conn.close()
            x=sql_to_list(str(values))
            return(x)
        except:
            cursor.execute('create table user(date varchar(20) ,time varchar(20),chuanganqi varchar(20),bieming varchar(20),wendu varchar(20),shidu varchar(20))')
            conn.commit()
            print('不存在数据库,已创建')
            #关闭cursor
            #关闭conn
            cursor.close()
            conn.close()
    except:
        print("创建失败")  

关于数据库的数据格式:
引用自:https://blog.csdn.net/qq_38880380/article/details/80115439
下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:

INTEGER
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
TEXT文本
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
NONENone类型
BLOB
no datatype specified
REAL实数
REAL实数
DOUBLE双精度实数
DOUBLE PRECISION
FLOAT单精度实数
NUMERI
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE日期类型。如:"%Y-%m-%d"
DATETIME时间类型,如:"%Y-%m-%d %H:%M:%S"
;