1. 程式人生 > >【Python入門】42.資料庫之 使用SQLite

【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吧( ̄▽ ̄)~*