原來(lái)Python自帶了數(shù)據(jù)庫(kù),用起來(lái)真方便!
Python作為數(shù)據(jù)科學(xué)主流語(yǔ)言,被廣泛用于數(shù)據(jù)讀存、處理、分析、建模,可以說(shuō)是無(wú)所不能。
數(shù)據(jù)一般存放在本地文件或者數(shù)據(jù)庫(kù)里,之前介紹過(guò)如何使用python讀取本地文件,也對(duì)# PyMySQL、cx_Oracle等數(shù)據(jù)庫(kù)連接庫(kù)做過(guò)簡(jiǎn)單的使用分享。
教你使用Python玩轉(zhuǎn)MySQL數(shù)據(jù)庫(kù),大數(shù)據(jù)導(dǎo)入不再是難題!
干貨!python與MySQL數(shù)據(jù)庫(kù)的交互實(shí)戰(zhàn)
這次推薦一個(gè)python自帶的輕量級(jí)數(shù)據(jù)庫(kù)模塊-sqlite3,先要弄清楚什么是SQLite:
SQLite是一種用C寫(xiě)的小巧的嵌入式數(shù)據(jù)庫(kù),它的數(shù)據(jù)庫(kù)就是一個(gè)文件。SQLite 不需要一個(gè)單獨(dú)的服務(wù)器進(jìn)程或操作的系統(tǒng),不需要配置,這意味著不需要安裝或管理,所有的維護(hù)都來(lái)自于SQLite 軟件本身。
sqlite3模塊不同于PyMySQL模塊,PyMySQL是一個(gè)python與mysql的溝通管道,需要你在本地安裝配置好mysql才能使用,而SQLite是python自帶的數(shù)據(jù)庫(kù),不需要任何配置,使用sqlite3模塊就可以驅(qū)動(dòng)它。
本文我們將進(jìn)行連接 SQLite數(shù)據(jù)庫(kù)、創(chuàng)建表、插入數(shù)據(jù)、讀取數(shù)據(jù)、修改數(shù)據(jù)等操作。
1. 導(dǎo)入sqlite3模塊
sqlite3是內(nèi)置模塊,所以不需要安裝的,直接import導(dǎo)入即可:
- import sqlite3
2. 創(chuàng)建與SQLite數(shù)據(jù)庫(kù)的連接
使用sqlite3.connect()函數(shù)連接數(shù)據(jù)庫(kù),返回一個(gè)Connection對(duì)象,我們就是通過(guò)這個(gè)對(duì)象與數(shù)據(jù)庫(kù)進(jìn)行交互。數(shù)據(jù)庫(kù)文件的格式是filename.db,如果該數(shù)據(jù)庫(kù)文件不存在,那么它會(huì)被自動(dòng)創(chuàng)建。該數(shù)據(jù)庫(kù)文件是放在電腦硬盤(pán)里的,你可以自定義路徑,后續(xù)操作產(chǎn)生的所有數(shù)據(jù)都會(huì)保存在該文件中。
- # 創(chuàng)建與數(shù)據(jù)庫(kù)的連接
- conn = sqlite3.connect('test.db')
還可以在內(nèi)存中創(chuàng)建數(shù)據(jù)庫(kù),只要輸入特殊參數(shù)值:memory:即可,該數(shù)據(jù)庫(kù)只存在于內(nèi)存中,不會(huì)生成本地?cái)?shù)據(jù)庫(kù)文件。
- conn = sqlite3.connect(':memory:')
建立與數(shù)據(jù)庫(kù)的連接后,需要?jiǎng)?chuàng)建一個(gè)游標(biāo)cursor對(duì)象,該對(duì)象的.execute()方法可以執(zhí)行sql命令,讓我們能夠進(jìn)行數(shù)據(jù)操作。
- #創(chuàng)建一個(gè)游標(biāo) cursor
- cur = conn.cursor()
3. 在SQLite數(shù)據(jù)庫(kù)中創(chuàng)建表
這里就要執(zhí)行sql的建表語(yǔ)句了,我們先創(chuàng)建一張如下的學(xué)生成績(jī)表-scores:
該表目前只有字段名和數(shù)據(jù)類(lèi)型,沒(méi)有數(shù)據(jù),執(zhí)行以下語(yǔ)句實(shí)現(xiàn):
- # 建表的sql語(yǔ)句
- sql_text_1 = '''CREATE TABLE scores
- (姓名 TEXT,
- 班級(jí) TEXT,
- 性別 TEXT,
- 語(yǔ)文 NUMBER,
- 數(shù)學(xué) NUMBER,
- 英語(yǔ) NUMBER);'''
- # 執(zhí)行sql語(yǔ)句
- cur.execute(sql_text_1)
4. 向表中插入數(shù)據(jù)
建完表-scores之后,只有表的骨架,這時(shí)候需要向表中插入數(shù)據(jù):
執(zhí)行以下語(yǔ)句插入單條數(shù)據(jù):
- # 插入單條數(shù)據(jù)
- sql_text_2 = "INSERT INTO scores VALUES('A', '一班', '男', 96, 94, 98)"
- cur.execute(sql_text_2)
執(zhí)行以下語(yǔ)句插入多條數(shù)據(jù):
- data = [('B', '一班', '女', 78, 87, 85),
- ('C', '一班', '男', 98, 84, 90),
- ]
- cur.executemany('INSERT INTO scores VALUES (?,?,?,?,?,?)', data)
- # 連接完數(shù)據(jù)庫(kù)并不會(huì)自動(dòng)提交,所以需要手動(dòng) commit 你的改動(dòng)conn.commit()
5. 查詢(xún)數(shù)據(jù)
我們已經(jīng)建好表,并且插入了三條數(shù)據(jù),現(xiàn)在來(lái)查詢(xún)特定條件下的數(shù)據(jù):
- # 查詢(xún)數(shù)學(xué)成績(jī)大于90分的學(xué)生
- sql_text_3 = "SELECT * FROM scores WHERE 數(shù)學(xué)>90"
- cur.execute(sql_text_3)
- # 獲取查詢(xún)結(jié)果
- cur.fetchall()
返回:
備注:獲取查詢(xún)結(jié)果一般可用.fetchone()方法(獲取第一條),或者用.fetchall()方法(獲取所有條)。
6. 其他操作
對(duì)數(shù)據(jù)庫(kù)做改動(dòng)后(比如建表、插數(shù)等),都需要手動(dòng)提交改動(dòng),否則無(wú)法將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)。
- # 提交改動(dòng)的方法
- conn.commit()
使用完數(shù)據(jù)庫(kù)之后,需要關(guān)閉游標(biāo)和連接:
- # 關(guān)閉游標(biāo)
- cur.close()
- # 關(guān)閉連接
- conn.close()
附連接connection和游標(biāo)cursor的API方法: