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