Python3學習筆記32 資料庫

2021-09-20 10:18:29 字數 3770 閱讀 1124

程式執行的時候,資料都是在記憶體中的。當程式終止的時候,通常都需要將資料儲存到磁碟上,無論是儲存到本地磁碟,還是通過網路儲存到伺服器上,最終都會將資料寫入磁碟檔案。

而如何定義資料的儲存格式就是乙個大問題。如果我們自己來定義儲存格式,比如儲存乙個班級所有學生的成績單:

你還可用json格式儲存,也是文字檔案:

你還可以定義各種儲存格式,但是問題來了:

訪問和讀取需要自己實現,json還是標準,自己定義的格式就各式各樣了;

不能做快速查詢,只有把資料全部讀到記憶體中才能遍歷,但有時候資料的大小遠遠超過了記憶體(比如藍光電影,40gb的資料),根本無法全部讀入記憶體。

為了便於程式儲存和讀取資料,而且,能直接通過條件快速查詢到指定的資料,就出現了資料庫(database)這種專門用於集中儲存和查詢的軟體。

資料庫軟體誕生的歷史非常久遠,早在2023年資料庫就誕生了。經歷了網狀資料庫,層次資料庫,我們現在廣泛使用的關聯式資料庫是20世紀70年代基於關係模型的基礎上誕生的。

關係模型有一套複雜的數學理論,但是從概念上是十分容易理解的。

nosql

你也許還聽說過nosql資料庫,很多nosql宣傳其速度和規模遠遠超過關聯式資料庫,所以很多同學覺得有了nosql是否就不需要sql了呢?千萬不要被他們忽悠了,連sql都不明白怎麼可能搞明白nosql呢?

資料庫類別

既然我們要使用關聯式資料庫,就必須選擇乙個關聯式資料庫。目前廣泛使用的關聯式資料庫也就這麼幾種:

付費的商用資料庫:

oracle,典型的高富帥;

sql server,微軟自家產品,windows定製專款;

db2,ibm的產品,聽起來挺高階;

sybase,曾經跟微軟是好朋友,後來關係破裂,現在家境慘淡。

這些資料庫都是不開源而且付費的,最大的好處是花了錢出了問題可以找廠家解決,不過在web的世界裡,常常需要部署成千上萬的資料庫伺服器,當然不能大把大把的把銀子扔給廠家,所以,無論是google、facebook,還是國內的bat,無一例外都選擇了免費的開源資料庫:

mysql,大家都在用,一般錯不了;

postgresql,學術氣息有點重,其實挺不錯,但知名度沒有mysql高;

sqlite,嵌入式資料庫,適合桌面和移動應用。

作為python開發工程師,選擇哪個免費關聯式資料庫呢?當然是mysql。因為mysql普及率高,出了錯,可以很容易找到解決方法。而且,圍繞mysql有一大堆監控和運維的工具,安裝和使用很方便。

python就內建了sqlite3,所以在python中使用sqlite,不需要安裝任何東西,直接使用。

在使用sqlite前,我們先要搞清楚幾個概念:

表是資料庫中存放關係資料的集合,乙個資料庫裡面通常包含多個表,比如學生的表,班級的表,學校的表,等等。表和表之間通過外來鍵關聯。

要操作關聯式資料庫,首先需要連線到關聯式資料庫,乙個資料庫連線稱為connection;

連線到資料庫後,需要開啟游標,稱之為cursor,通過cursor執行sql語句,只需要提供符合python標準的資料庫驅動即可。

由於sqlite的驅動內建在python標準庫中,所以我們可以直接操作sqlite資料庫。

我們在python互動式命令列實踐一下:

#匯入sqlite驅動:

import sqlite3

#連線到sqlite資料庫

#資料庫檔案是test.db

#如果檔案不存在,會自動在當前目錄建立:

conn=sqlite3.connect('test.db')

#建立乙個cursor:

cursor=conn.cursor()

#執行一條sql語句,建立user表:

#cursor.execute(' create table user(id varchar(20) primary key,name varchar(20))')

cursor.execute('insert into user(id,name) values(\'2\',\'z-bibi\')')

#通過rowcount獲得插入的行數:

print(cursor.rowcount)

#關閉cursor:

cursor.close()

#提交事務:

conn.commit()

#關閉connection:

conn.close()

獲得查詢結果集合:

#匯入sqlite驅動:

import sqlite3

#連線到sqlite資料庫

#資料庫檔案是test.db

#如果檔案不存在,會自動在當前目錄建立:

conn=sqlite3.connect('test.db')

#建立乙個cursor:

cursor=conn.cursor()

#執行一條sql語句,建立user表:

#cursor.execute(' create table user(id varchar(20) primary key,name varchar(20))')

cursor.execute('insert into user(id,name) values(\'5\',\'t-bibi\')')

#通過rowcount獲得插入的行數:

print(cursor.rowcount)

cursor.execute('select * from user')

#獲得查詢結果集

vaules=cursor.fetchall()

print(vaules)

#關閉cursor:

cursor.close()

#提交事務:

conn.commit()

#關閉connection:

conn.close()

查詢結果如下:

使用python的db-api時,只需要搞清楚connection和cursor物件,開啟後一定記得關閉,就可以放心地使用。

使用cursor物件執行insert,update,delete語句時,執行結果由rowcount返回影響的行數,就可以拿到執行結果。

使用cursor物件執行select語句時,通過featchall()可以拿到結果集。結果集是乙個list,每個元素都是乙個tuple,對應一行記錄。

如果sql語句帶有引數,那麼需要把引數按照位置傳遞給execute()方法,有幾個?佔位符就必須對應幾個引數,例如:

cursor.execute(『select * from user where id=?』,『1』)

sqlite支援常見的標準sql語句以及幾種常見的資料型別。具體文件請參閱sqlite官方**。

小結在python中運算元據庫時,要先導入資料庫對應的驅動,然後,通過connection物件和cursor物件運算元據。

要確保開啟的connection物件和cursor物件都正確關閉,否則,資源久會洩露。

如何才能確保出錯的情況下也關閉掉connection物件和cursor物件呢?請回憶try。。。except。。。finally的用法。

Python3學習筆記

最近在起步學python,聚合一下這個過程中蒐集的資源和對一些基本知識做個小總結,語法基於python3,方便以後查詢。python官方文件 不錯的基礎課程 基本語法 演算法 建模 練習 以下是整理常用可能遺忘的基礎點 python3中的輸入是input 獲得使用者輸入的字串 a input ple...

python3學習筆記

redis訊息佇列的使用 coding utf 8 created on tue mar 26 15 58 34 2019 author admin import redis class redisqueue object def init self,name,namespace queue red...

python3 學習筆記

python3學習筆記 python基礎 輸出 print 括號中加上想要輸出的資料,就可以將指定內容輸出至螢幕。1.輸出的時候要注意資料型別。字串,整數等等 2.括號中可以包含多個字串,使用逗號隔開就可以了。但是每次輸出遇到這個連線逗號的時候都會輸出乙個空格。3.括號中的內容也可以是變數名和計算公...