【Python入门】42.数据库之 使用SQLite

摘要:数据库的简单介绍;关系数据库的简单介绍;SQLite的基本语法介绍


*写在前面:为了更好的学习python,博主记录下自己的学习路程。本学习笔记基于廖雪峰的Python教程,如有侵权,请告知删除。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ *


数据库

当程序运行时,数据是在内存中的,当程序终止时,就要把数据保存到磁盘。

我们可以把用各式各样的格式来储存数据,如用记事本记录,以逗号隔开每个数据;用excel记录数据等等。

但这样出现各种问题如,读取数据时格式不兼容,难以查询和阅读数据等等。

数据库就是专门用来管理和储存数据的

关系数据库

我们现在广泛使用的是关系数据库

什么叫关系数据库呢?举个简单的例子:
这里写图片描述

这个表格用于记录每个事件及对应的日期。

注意到,每个年份对应多个月份,而每个月份对应多个天数,每一天对应多个事件。

如果我们查询2016年的全部数据,就会把2016年里12个月,每个月对应的日及对应的每个事件显示出来。

如果我们查询2016年1月7日的数据,就会把a1、a2、a3事件显示出来。

这种基于表的一对多的关系就是关系数据库的基础

关系数据库有很多种,一般我们使用的话是选择免费的开源数据库。

在这里我们将介绍如何通过Python连接使用MySQL。

MySQL的普及率很高,使用起来也很方便。接下来的教程需要用到MySQL,大家可以前往MySQL官方网站下载免费的版本。

使用SQLite

在介绍MySQL之前,先介绍SQLite

SQLite是一种嵌入式数据库,由C编写,体积小,可以集成到各种应用中。Python内置了SQLite,可以直接使用。

在使用之前介绍一下数据库的基本概念:

是用于存放数据的集合。一个数据库包含多个表,如年份表,月份表等,每个表之间通过外键关联。

要操作数据库,首先要连接数据库,一个数据库连接称为一个Connection

连接后,需要打开游标Cursor,通过Cursor执行SQL语句。

我们试一下通过Python操作SQLite数据库:

在Python交互式命令行下直接操作,

首先导入模块sqlite3,建立连接,创建游标:

>>>import sqlite3
>>>conn = sqlite3.connect('test.db')
>>>cursor = conn.cursor()

然后执行SQL语句,创建一个user表,并且添加一条数据:

>>>cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
<sqlite3.Cursor object at 0x0000000002542810>
>>>cursor.execute('insert into user (id, name) values (\'1\', \'Ming\')')
<sqlite3.Cursor object at 0x0000000002542810>

通过cursor对象,执行create语句可以创建一个表,执行insert语句可以添加数据,执行update语句可以更新数据,执行delete语句可以删除数据。之后我们可以通过rowcount语句返回影响的行数,像这样:

>>>cursor.rowcount
1

结果显示我们刚刚添加了一条数据。

我们可以执行select语句,然后通过featchall()拿取结果:

>>> cursor.execute('select * from user where id=?', ('1',))
<sqlite3.Cursor object at 0x0000000002542810>
>>> values = cursor.fetchall()
>>> values
[('1', 'Ming')]

可以看到,返回值是一个list,每一个元素是一个tuple,对应每一条数据。

这里execute()方法中的为占位符,当需要传入多个参数时,就用多个表示,随后输入对应的参数,如:

cursor.execute('select * from user where year=? and month=?', ('2018', 'Sept'))

使用完之后记得提交事务,并且把connection和cursor都关闭,以防数据泄露:

>>> cursor.close()
>>> conn.commit()
>>> conn.close()

SQLite支持常见的标准SQL语句以及几种常见的数据类型。具体文档请参阅SQLite官方网站。

• 【练习】根据分数段查找指定的名字
请编写函数,在Sqlite中根据分数段查找指定的名字*(练习源自廖雪峰官方)*:

# -*- coding: utf-8 -*-

import os, sqlite3

db_file = os.path.join(os.path.dirname(__file__), 'test.db')
if os.path.isfile(db_file):
    os.remove(db_file)

# 初始数据:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
cursor.close()
conn.commit()
conn.close()

# 返回指定分数区间的名字,并且按分数从小到大排序
def get_score_in(low, high):

    try:
        conn = sqlite3.connect(db_file)
        cursor = conn.cursor()
    # 检测错误
    except sqlite3.DatabaseError as err:
        print(err)
    else:
        # 拿取数据并排序
        cursor.execute('select * from user where score >= ? and score <= ? order by score', (low, high))
        data = cursor.fetchall()
        # 返回只包含name的一个list
        return list(map(lambda x:x[1],data))
    finally:
        cursor.close()
        conn.commit()
        conn.close()

# 测试:
assert get_score_in(80, 95) == ['Adam'], get_score_in(80, 95)
assert get_score_in(60, 80) == ['Bart', 'Lisa'], get_score_in(60, 80)
assert get_score_in(60, 100) == ['Bart', 'Lisa', 'Adam'], get_score_in(60, 100)

思路解析:

1.在执行select语句时,使用order by score语句实现分数排序;

2.通过map()函数实现只返回数据中的名字一项;

3.添加try…finally语句保证connection和cursor的关闭。


以上就是本节的全部内容,感谢你的阅读。

下一节内容:数据库之 使用MySQL

有任何问题与想法,欢迎评论与吐槽。

和博主一起学习Python吧( ̄▽ ̄)~*

猜你喜欢

转载自blog.csdn.net/lecorn/article/details/82776131