SQLite3 of python

一、SQLite3 数据库

  SQLite3 可使用 sqlite3 模块与 Python 进行集成,一般 python 2.5 以上版本默认自带了sqlite3模块,因此不需要用户另外下载。

在 学习基本语法之前先来了解一下数据库是使用流程吧 ↓↓↓

所以,首先要创建一个数据库的连接对象,即connection对象,语法如下:

sqlite3.connect(database [,timeout,其他可选参数])

function: 此API打开与SQLite数据库文件的连接。如果成功打开数据库,则返回一个连接对象。

database: 数据库文件的路径,或 “:memory:” ,后者表示在RAM中创建临时数据库。

timeout: 指定连接在引发异常之前等待锁定消失的时间,默认为5.0(秒)

有了connection对象,就能创建游标对象了,即cursor对象,如下:

connection.cursor([cursorClass])

function: 创建一个游标,返回游标对象,该游标将在Python的整个数据库编程中使用。

接下来,看看connection对象 和 cursor对象的 “技能” 吧  ↓↓↓

connection对象的方法
方法 说明
connect.cursor() 上述,返回游标对象
connect.execute(sql [,parameters]) 创建中间游标对象执行一个sql命令
connect.executemany(sql [,parameters]) 创建中间游标对象执行一个sql命令
connect.executescript(sql_script) 创建中间游标对象, 以脚本的形式执行sql命令
connect.total_changes() 返回自打开数据库以来,已增删改的行的总数
connect.commit() 提交当前事务,不使用时为放弃所做的修改,即不保存
connect.rollback() 回滚自上次调用commit()以来所做的修改,即撤销
connect.close() 断开数据库连接
cursor对象的方法
方法 说明
cursor.execute(sql [,parameters]) 执行一个sql命令
cursor.executemany(sql,seq_of_parameters) 对 seq_of_parameters 中的所有参数或映射执行一个sql命令
cursor.executescript(sql_script) 以脚本的形式一次执行多个sql命令
cursor.fetchone() 获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时,则返回 None。
cursor.fetchmany([size=cursor.arraysize]) 获取查询结果集中的下一行组,返回一个列表。当没有更多的可用的行时,则返回一个空的列表。size指定特定行数。
cursor.fetchall() 获取查询结果集中所有(剩余)的行,返回一个列表。当没有可用的行时,则返回一个空的列表。

下面用一个简单实例作为介绍 >>>

 def SQLite_Test():
# =========== 连接数据库 ============
# 1. 连接本地数据库
connectA = sqlite3.connect("example.db")
# 2. 连接内存数据库,在内存中创建临时数据库
connectB = sqlite3.connect(":memory:") # =========== 创建游标对象 ============
cursorA = connectA.cursor()
cursorB = connectB.cursor() # =========== 创建表 ============
cursorA.execute("CREATE TABLE class(id real, name text, age real, sex text)")
cursorB.execute("CREATE TABLE family(relation text, job text, age real)") # =========== 插入数据 ============
cursorA.execute("INSERT INTO class VALUES(1,'Jock',8,'M')")
cursorA.execute("INSERT INTO class VALUES(2,'Mike',10,'M')")
# 使用 ? 占位符
cursorA.execute("INSERT INTO class VALUES(?,?,?,?)", (3,'Sarah',9,'F')) families = [
['Dad', 'CEO', 35],
['Mom', 'singer', 33],
['Brother', 'student', 8]
]
cursorB.executemany("INSERT INTO family VALUES(?,?,?)",families) # =========== 查找数据 ============
# 使用 命名变量 占位符
cursorA.execute("SELECT * FROM class WHERE sex=:SEX", {"SEX":'M'})
print("TABLE class: >>>select Male\n", cursorA.fetchone())
cursorA.close() cursorB.execute("SELECT * FROM family ORDER BY relation")
print("TABLE family:\n", cursorB.fetchall())
cursorB.close() # =========== 断开连接 ============
connectA.close()
connectB.close() SQLite_Test()

  运行结果:

TABLE class: >>>select Male
(1.0, 'Jock', 8.0, 'M')
TABLE family:
[('Brother', 'student', 8.0), ('Dad', 'CEO', 35.0), ('Mom', 'singer', 33.0)]

二、小练手

使用目前学的sqlite3数据库知识,对一些数据进行增删查改的操作。此处选择来自下面网站的数据

url = http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html

先将数据从网站上爬取下来,存储为csv文件,然后再保存到数据库中,接着进行数据的操作。对于如何存储为csv文件,请查看 >>> 《此处的最后一个小主题

对于本次小练习的介绍:

目的:对已爬取的数据进行数据库管理和简单操作

步骤: 创建数据库文件 >>> 创建表 >>> 保存数据到数据库 >>> 对数据进行简单操作

方法:我采用的方法是:

① 编写一个函数( get_data(fileName) ):读取csv文件中的数据,主要完成对数据的格式转换,以便适合保存到数据库中

② 编写一个函数类( class SQL_method ):对数据库进行简单操作,主要完成数据库的创建和数据的增删查改

对 SQL_method 类的方法说明
方法 说明
__init__(self, dbName, tabelName, data, columns, COLUMNS, Read_All=True) 对参数进行初始化,参数含义分别为:数据库名称、表格名称、数据、表格首行(用于创建表)、表格首行(用于格式输出)、输出所有数据(插入数据后)
creatTable(self) 创建数据库文件、创建表格
destroyTable(self) 删除表格
insertDatas(self) 向数据库的表格中插入多条数据
getAllData(self) 以列表形式返回数据库表格中的所有数据
searchData(self, condition, IfPrint=True) 查找特定数据, 参数的含义分别为:查找条件、是否输出(查找的数据)
deleteData(self, condition) 在数据库的表格中删除特定数据, 参数为删除条件
printData(self, data) 输出数据, 参数为需要输出的数据
run(self) 运行创建数据库和表格的函数,同时支持输出所有数据(依靠Read_All)

③ 尝试其他操作 ( 以下的所有操作均在 main 函数中实现 ):

a. 在数据库中查找某一项记录

b. 对数据按照某种排序输出

c. 对数据进行增加权值操作,实现重新排序 【权值详情

d. 删除数据库中的某些记录

e. 删除数据库中的表

好了,有了前进的方向,那我们杨帆 ----- 起航 >>>

 # -*- coding: utf-8 -*-
'''
使用 url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html" 的数据进行SQLite3数据库的练习使用
@author: bpf
''' import sqlite3
from pandas import DataFrame
import re class SQL_method:
'''
function: 可以实现对数据库的基本操作
'''
def __init__(self, dbName, tableName, data, columns, COLUMNS, Read_All=True):
'''
function: 初始化参数
dbName: 数据库文件名
tableName: 数据库中表的名称
data: 从csv文件中读取且经过处理的数据
columns: 用于创建数据库,为表的第一行
COLUMNS: 用于数据的格式化输出,为输出的表头
Read_All: 创建表之后是否读取出所有数据
'''
self.dbName = dbName
self.tableName = tableName
self.data = data
self.columns = columns
self.COLUMNS = COLUMNS
self.Read_All = Read_All def creatTable(self):
'''
function: 创建数据库文件及相关的表
'''
# 连接数据库
connect = sqlite3.connect(self.dbName)
# 创建表
connect.execute("CREATE TABLE {}({})".format(self.tableName, self.columns))
# 提交事务
connect.commit()
# 断开连接
connect.close() def destroyTable(self):
'''
function: 删除数据库文件中的表
'''
# 连接数据库
connect = sqlite3.connect(self.dbName)
# 删除表
connect.execute("DROP TABLE {}".format(self.tableName))
# 提交事务
connect.commit()
# 断开连接
connect.close() def insertDataS(self):
'''
function: 向数据库文件中的表插入多条数据
'''
# 连接数据库
connect = sqlite3.connect(self.dbName)
# 插入多条数据
connect.executemany("INSERT INTO {} VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)".format(self.tableName), self.data)
#for i in range(len(self.data)):
# connect.execute("INSERT INTO university VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)", data[i])
# 提交事务
connect.commit()
# 断开连接
connect.close() def getAllData(self):
'''
function: 得到数据库文件中的所有数据
'''
# 连接数据库
connect = sqlite3.connect(self.dbName)
# 创建游标对象
cursor = connect.cursor()
# 读取数据
cursor.execute("SELECT * FROM {}".format(self.tableName))
dataList = cursor.fetchall()
# 断开连接
connect.close()
return dataList def searchData(self, conditions, IfPrint=True):
'''
function: 查找特定的数据
'''
# 连接数据库
connect = sqlite3.connect(self.dbName)
# 创建游标
cursor = connect.cursor()
# 查找数据
cursor.execute("SELECT * FROM {} WHERE {}".format(self.tableName, conditions))
data = cursor.fetchall()
# 关闭游标
cursor.close()
# 断开数据库连接
connect.close()
if IfPrint:
self.printData(data)
return data def deleteData(self, conditions):
'''
function: 删除数据库中的数据
'''
# 连接数据库
connect = sqlite3.connect(self.dbName)
# 插入多条数据
connect.execute("DELETE FROM {} WHERE {}".format(self.tableName, conditions))
# 提交事务
connect.commit()
# 断开连接
connect.close() def printData(self, data):
print("{1:{0}^3}{2:{0}<11}{3:{0}<4}{4:{0}<4}{5:{0}<5}{6:{0}<5}{7:{0}^5}{8:{0}^5}{9:{0}^5}{10:{0}^5}{11:{0}^5}{12:{0}^6}{13:{0}^5}".format(chr(12288), *self.COLUMNS))
for i in range(len(data)):
print("{1:{0}<4.0f}{2:{0}<10}{3:{0}<5}{4:{0}<6}{5:{0}<7}{6:{0}<8}{7:{0}<7.0f}{8:{0}<8}{9:{0}<7.0f}{10:{0}<6.0f}{11:{0}<9.0f}{12:{0}<6.0f}{13:{0}<6.0f}".format(chr(12288), *data[i])) def run(self):
try:
# 创建数据库文件
self.creatTable()
print(">>> 数据库创建成功!")
# 保存数据到数据库
self.insertDataS()
print(">>> 表创建、数据插入成功!")
except:
print(">>> 数据库已创建!")
# 读取所有数据
if self.Read_All:
self.printData(self.getAllData()) def get_data(fileName):
'''
function: 读取获得大学排名的数据 并 将结果返回
'''
data = []
# 打开文件
f = open(fileName, 'r', encoding='utf-8')
# 按行读取文件
for line in f.readlines():
# 替换掉其中的换行符和百分号 替换百分号是为了方便之后的排序和运算
line = line.replace('\n', '')
line = line.replace('%','')
# 将字符串按照 ',' 分割为列表
line = line.split(',') for i in range(len(line)):
# 使用 异常处理 避开 出现中文无法转换 的错误
try:
# 将空值填充为 0
if line[i] == '':
line[i] = ''
# 将数字转换为数值
line[i] = eval(line[i])
except:
continue
data.append(tuple(line))
# EN_columns、CH_columns 分别为 用于数据库创建、数据的格式化输出
EN_columns = "Rank real, University text, Province text, Grade real, SourseQuality real, TrainingResult real, ResearchScale real, \
ReserchQuality real, TopResult real, TopTalent real, TechnologyService real, Cooperation real, TransformationResults real"
CH_columns = ["排名", "学校名称", "省市", "总分", "生涯质量", "培养结果(%)", "科研规模", "科研质量", "顶尖成果", "顶尖人才", "科技服务", "产学研合作", "成果转化"]
return data[1:], EN_columns, CH_columns if __name__ == "__main__":
# =================== 设置和得到基本数据 ===================
fileName = "D:\\University_Rank.csv"
data, EN_columns, CH_columns = get_data(fileName)
dbName = "university.db"
tableName = "university" # ================= 创建一个SQL_method对象 ==================
SQL = SQL_method(dbName, tableName, data, EN_columns, CH_columns, False) # =================== 创建数据库并保存数据 ===================
SQL.run() # =================== 在数据库中查找数据项 ===================
# 查找记录并输出结果
print(">>> 查找数据项(University = '广东工业大学') :")
SQL.searchData("University = '广东工业大学'", True) # ================= 在数据库中筛选数据项并排序 ==================
# 将选取广东省的数据 并 对科研规模大小排序
print("\n>>> 筛选数据项并按照科研规模排序(Province = '广东省') :")
SQL.searchData("Province = '广东省' ORDER BY ResearchScale", True) # =============== 对数据库中的数据进行重新排序操作 ================
# 定义权值
Weight = [0.3, 0.15, 0.1, 0.1, 0.1, 0.1, 0.05, 0.05, 0.05]
value, sum = [], 0
# 获取 Province = '广东省' 的所有数据
sample = SQL.searchData("Province = '广东省'", False)
# 按照权值求出各个大学的总得分
for i in range(len(sample)):
for j in range(len(Weight)):
sum += sample[i][4+j] * Weight[j]
value.append(sum)
sum = 0
# 将结果通过 pandas 的 DataFrame 方法组成一个二维序列
university = [university[1] for university in sample]
uv, tmp = [], []
for i in range(len(university)):
tmp.append(university[i])
tmp.append(value[i])
uv.append(tmp)
tmp = []
df = DataFrame(uv, columns=list(("大学", "总分")))
df = df.sort_values('总分')
df.index = [i for i in range(1, len(uv)+1)]
# 输出结果
print("\n>>> 筛选【广东省】的大学并通过权值运算后重排名的结果:\n", df) # ===================== 在数据库中删除数据项 =====================
SQL.deleteData("Province = '北京市'")
SQL.deleteData("Province = '广东省'")
SQL.deleteData("Province = '山东省'")
SQL.deleteData("Province = '山西省'")
SQL.deleteData("Province = '江西省'")
SQL.deleteData("Province = '河南省'")
print("\n>>> 数据删除成功!")
SQL.printData(SQL.getAllData()) # ====================== 在数据库中删除表 ========================
SQL.destroyTable()
print(">>> 表删除成功!

用于我将所有的要求都写在 main 函数中,因此显得有点乱,但只要明白上面提及的要求就不乱了!

那我们看看执行效果吧,有些地方结果太多就不 一 一 展示。

^ v ^ 今天就分享到这,下期再会 ~~~

SQLite3 of python的更多相关文章

  1. sqlite3 on python for newbies

    python 集成了 sqlite3 ,其接口很简单: import sqlite3 db_connection = sqlite3.connect(db_filename) db_cursor = ...

  2. From CSV to SQLite3 by python 导入csv到sqlite

    '''初次使用SQLite,尝试把之前一个csv文件导进去,看了网上各种教程,大多是在SQLite shell模式下使用的,比较麻烦, 这里用了panda,就方便多了,仅作示例供参考. 第一篇开博,想 ...

  3. python使用上下文管理器实现sqlite3事务机制

    如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制. 1.python上下文管理(with) python上下文管理(context),解决的是这样一类 ...

  4. python sqlite3 数据库操作

    python sqlite3 数据库操作 SQLite3是python的内置模块,是一款非常小巧的嵌入式开源数据库软件. 1. 导入Python SQLite数据库模块 import sqlite3 ...

  5. python sqlite3 入门 (视频讲座)

    python sqlite3 入门 (视频讲座) an SQLite mini-series! - Simple Databases with Python 播放列表: YouTube https:/ ...

  6. Python学习笔记:sqlite3(sqlite数据库操作)

    对于数据库的操作,Python中可以通过下载一些对应的三方插件和对应的数据库来实现数据库的操作,但是这样不免使得Python程序变得更加复杂了.如果只是想要使用数据库,又不想下载一些不必要的插件和辅助 ...

  7. Python 资源

    转:http://www.360doc.com/content/16/0308/14/31385575_540482688.shtml 本页面是俺收集的各种 Python 资源,不定期更新. 下面列出 ...

  8. python开源项目及示例代码

    本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...

  9. Python读取和处理文件后缀为".sqlite"的数据文件

    最近在弄一个项目分析的时候,看到有一个后缀为”.sqlite”的数据文件,由于以前没怎么接触过,就想着怎么用python来打开并进行数据分析与处理,于是稍微研究了一下. SQLite是一款非常流行的关 ...

随机推荐

  1. GridView相同内容合并单元格

    using System;using System.Data;using System.Configuration;using System.Collections;using System.Web; ...

  2. java递归展示树形图代码实现以及遇到的问题

    我最近写到了一个项目中用到了树形图,不得不说这个树形图是真的扯淡: 我用到的是layui中的树形图,再展示数据过程中遇到了很多的问题,废话不多说,直接贴代码. 一.调用排序接口,对数据进行排序. 二. ...

  3. 输入网址调用第三方接口获取结果_java

    最近公司给了一个第三方服务的网址,要我调用后返回需要用到的信息 具体网址:http://www.xxxx.com/xxx-api/xxxx/getXxxByUserId?userId=" + ...

  4. cf1040E. Network Safety(并查集)

    题意 题目链接 一张图,n个点,m条边,每个点有个权值x,x<=1e18.如果一条边的两个端点不一样,那么这条边是安全的,开始时所有边都是安全的. 现在有一个病毒y,病毒可以入侵任意的点,入侵一 ...

  5. laydate 显示结束时间不小于开始时间

    jsp: <div class="form-group">    <label >交易时间:</label>        <input ...

  6. Vue.js(2.x)之计算属性

    昨天看完大神的文章后,深感惭愧,硬着头皮继续看官网文档,然而这真的没是没办法,介绍的实在有些敷衍: 1).计算属性:也不说下computed是计算属性关键词,vm实例是可以像代理data一样代理com ...

  7. <Android 基础(三)> MVP模式

    前言 MVP,这里指的并不是篮球比赛中的MVP(最有价值球员),而是一种代码框架和设计思想,它是由MVC演变而来的. MVP模式(Model-View-Presenter) 是MVC模式的一个衍生.主 ...

  8. IntelliJ IDEA IDEA 2018 激活注册码

    K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZWVOYW1lIjoibnNzIDEwMDEiLCJhc3NpZ25lZU5hbWUiO ...

  9. silverlight数据绑定模式TwoWay,OneWay,OneTime的研究

    asp.net开发中,数据绑定是一个很简单的概念,控件与数据绑定后,控件可以自动把数据按一定的形式显示出来.(当然控件上的值改变后,可以通过提交页面表单,同时后台服务端代码接收新值更新数据) silv ...

  10. touch事件总结

    $("body").on("touchstart", function(e) { e.preventDefault(); startX = e.original ...