关于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 |
NONE | None类型 |
---|---|
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" |