美文网首页程序员
【Python入门】42.数据库之 使用SQLite

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

作者: 三贝_ | 来源:发表于2018-09-19 18:27 被阅读18次

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


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


    目录

    数据库
    关系数据库
    使用SQLite

    数据库

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

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

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

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

    关系数据库

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

    什么叫关系数据库呢?举个简单的例子:


    数据库1.png

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

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

    如果我们查询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吧( ̄▽ ̄)~*

    相关文章

      网友评论

        本文标题:【Python入门】42.数据库之 使用SQLite

        本文链接:https://www.haomeiwen.com/subject/njtwnftx.html