Flask框架——Flask-SQLite數(shù)據(jù)庫(kù)

上篇文章我們學(xué)習(xí)了Flask框架——Flask-Mail郵件硕盹,這篇文章我們學(xué)習(xí)Flask-SQLite數(shù)據(jù)庫(kù)滨砍。

SQLite數(shù)據(jù)庫(kù)

SQLite是一款輕型的數(shù)據(jù)庫(kù)匆笤,遵守ACID的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),占用資源非常的低,能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語(yǔ)言相結(jié)合忽舟,比如Python、C#现拒、PHP、Java等望侈,還有ODBC接口印蔬,同樣比起Mysql、PostgreSQL這兩款開(kāi)源的世界著名數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)講脱衙,它的處理速度比他們都快侥猬。

SQLite3為SQLite的第一個(gè)版本例驹。
其特點(diǎn)為:

  • 零配置,無(wú)需安裝和管理配置退唠;

  • 儲(chǔ)存在單一磁盤(pán)文件中的一個(gè)完整的數(shù)據(jù)庫(kù)鹃锈;

  • 數(shù)據(jù)庫(kù)文件可以在不同字節(jié)順序的機(jī)器間自由的共享;

  • 足夠小, 大致13萬(wàn)行C代碼, 4.43M瞧预,支持?jǐn)?shù)據(jù)庫(kù)大小可至2TB屎债;

  • 數(shù)據(jù)庫(kù)操作快;

  • 不需要任何外部的依賴(lài)垢油。

雖然SQLite數(shù)據(jù)庫(kù)是零配置盆驹,無(wú)需安裝與管理,但為了能更好地管理SQLite中的數(shù)據(jù)庫(kù)滩愁,我們建議還是安裝躯喇,其安裝方法很簡(jiǎn)單。這里我們?cè)趙indows系統(tǒng)中安裝

安裝SQLite

在進(jìn)入SQLite下載頁(yè)面硝枉,找到Precompiled Binaries for Windows廉丽,如下圖所示:


下載紅框中的壓縮后,創(chuàng)建sqlite文件夾檀咙,并在此文件夾下解壓上面兩個(gè)壓縮文件雅倒,如下圖所示:

這里我們?cè)贓盤(pán)中創(chuàng)建sqlite文件夾璃诀,大家可以根據(jù)自身習(xí)慣來(lái)創(chuàng)建

解壓后弧可,需要將E:/sqlite添加到PATH環(huán)境變量中,如下圖所示:



在命令提示符中輸入sqlite3劣欢,如下圖所示:



好了棕诵,這樣就成功安裝SQLite了。

接下來(lái)我們通過(guò)Flask程序來(lái)演示如何使用SQLite凿将。

創(chuàng)建SQLite數(shù)據(jù)庫(kù)

創(chuàng)建Flask項(xiàng)目并在項(xiàng)目目錄下創(chuàng)建名為test.py文件校套,如下圖所示:



test.py文件作用為創(chuàng)建SQLite數(shù)據(jù)庫(kù),代碼如下所示:

import sqlite3
conn = sqlite3.connect('database.db')       #建立database.db數(shù)據(jù)庫(kù)連接
conn.execute('CREATE TABLE students (name TEXT, addr TEXT, city TEXT, pin TEXT)')   #執(zhí)行單條sql語(yǔ)句
conn.close()                            #關(guān)閉連接

創(chuàng)建SQLite數(shù)據(jù)庫(kù)很簡(jiǎn)單:建立連接——?jiǎng)?chuàng)建數(shù)據(jù)表——關(guān)閉連接牧抵。

使用sqlite3.connect()創(chuàng)建數(shù)據(jù)庫(kù)連接笛匙,當(dāng)連接的數(shù)據(jù)庫(kù)不存在時(shí),會(huì)自動(dòng)在test.py文件同級(jí)路徑下創(chuàng)建數(shù)據(jù)庫(kù)犀变,再使用execute()方法創(chuàng)建數(shù)據(jù)表妹孙,最后.close()關(guān)閉連接。

其中SQLite數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)表值類(lèi)型有:

存儲(chǔ)類(lèi) 描述
NULL 值是一個(gè) NULL 值获枝。
INTEGER 值是一個(gè)帶符號(hào)的整數(shù)蠢正,根據(jù)值的大小存儲(chǔ)在 1、2省店、3嚣崭、4笨触、6 或 8 字節(jié)中。
REAL 值是一個(gè)浮點(diǎn)值雹舀,存儲(chǔ)為 8 字節(jié)的 IEEE 浮點(diǎn)數(shù)字芦劣。
TEXT 值是一個(gè)文本字符串,使用數(shù)據(jù)庫(kù)編碼(UTF-8说榆、UTF-16BE 或 UTF-16LE)存儲(chǔ)持寄。
BLOB 值是一個(gè) blob 數(shù)據(jù),完全根據(jù)它的輸入存儲(chǔ)娱俺。

好了稍味,運(yùn)行test.py可以發(fā)現(xiàn)在項(xiàng)目目錄中創(chuàng)建了一個(gè)名為database的數(shù)據(jù)庫(kù)。

使用SQLite

首先在app.py文件中編寫(xiě)create_student視圖函數(shù)荠卷,代碼如下所示:

@app.route('/create')
def create_student():
    return render_template('student.html')      #渲染student.html模板

使用render_template()方法渲染student.html模板模庐,student.html模板代碼如下所示:

<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Title</title>
 </head>
    <body>
     <form action = "{{ url_for('add_student') }}" method = "POST">
          <p>姓名<input type = "text" name = "nm" /></p>
          <p>地址<textarea name = "add" ></textarea></p>
          <p>城市<input type = "text" name = "city" /></p>
          <p>郵編<input type = "text" name = "pin" /></p>
          <input type = "submit" value = "提交" />
       </form>
    </body>
 </html>

使用url_for()方法將表單中的數(shù)據(jù)傳遞到視圖函數(shù)add_student中,該視圖函數(shù)代碼如下所示:

@app.route('/addstudent',methods = ['POST', 'GET'])
def add_student():
    try:
        #獲取請(qǐng)求中的nm油宜、add掂碱、city、pin的數(shù)據(jù)
        nm = request.form['nm']
        addr = request.form['add']
        city = request.form['city']
        pin = request.form['pin']
        with sqlite3.connect("database.db") as con:     #建立與database.db數(shù)據(jù)庫(kù)的連接
           cur = con.cursor()               #獲取游標(biāo)
           cur.execute("INSERT INTO students (name,addr,city,pin) VALUES (?,?,?,?)",(nm,addr,city,pin) )                    #添加數(shù)據(jù)慎冤,執(zhí)行單條的sql語(yǔ)句
           con.commit()                 #提交事務(wù)
           msg = "數(shù)據(jù)添加成功"
    except:
        con.rollback()              #撤消當(dāng)前事務(wù)中所做的所有更改
        msg = "操作失敗"
    finally:
        return render_template("result.html",msg = msg)     #渲染result.html模板并傳遞msg值
        con.close()                 #關(guān)閉數(shù)據(jù)庫(kù)連接

首先獲取請(qǐng)求中的數(shù)據(jù)疼燥,在建立與database.db數(shù)據(jù)庫(kù)連接,使用.cursor()獲取數(shù)據(jù)庫(kù)游標(biāo)蚁堤,在使用execute()方法添加數(shù)據(jù)醉者,執(zhí)行單條sql語(yǔ)句,最后提交事務(wù)披诗,當(dāng)數(shù)據(jù)添加失敗時(shí)撬即,調(diào)用rollback()方法撤消當(dāng)前事務(wù)中所做的所有更改,使用render_template()方法渲染result.html模板并傳遞msg值呈队。

result.html模板代碼如下所示:

<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Title</title>
 </head>
    <body>
       操作結(jié)果 : {{ msg }}
    </body>
 </html>

接下來(lái)編寫(xiě)展示數(shù)據(jù)的視圖函數(shù)show_student剥槐,代碼如下所示:

@app.route('/show')
def show_student():
    con = sqlite3.connect("database.db")        #建立數(shù)據(jù)庫(kù)連接
    con.row_factory = sqlite3.Row              #設(shè)置row_factory,對(duì)查詢(xún)到的數(shù)據(jù),通過(guò)字段名獲取列數(shù)據(jù)
    cur = con.cursor()                        #獲取游標(biāo)
    cur.execute("select * from students")        #執(zhí)行sql語(yǔ)句選擇數(shù)據(jù)表
    rows = cur.fetchall()                       #獲取多條記錄數(shù)據(jù)           
    return render_template("show.html",rows = rows)     #渲染show.html模板并傳遞rows值

建立數(shù)據(jù)庫(kù)連接并設(shè)置row_factory對(duì)象查詢(xún)到的數(shù)據(jù)通過(guò)字段名來(lái)獲取列數(shù)據(jù)宪摧,使用cursor()方法獲取數(shù)據(jù)操作游標(biāo)粒竖,再使用execute()方法執(zhí)行sql語(yǔ)句選擇數(shù)據(jù)表,使用fetchall()放過(guò)獲取多條數(shù)據(jù)几于,最后使用render_template方法渲染show.html模板并傳遞rows值蕊苗。

show.html模板代碼如下所示:

<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Title</title>
 </head>
    <body>
       <table border = 1>
          <thead>
             <td>改名</td>
             <td>地址</td>
             <td>城市</td>
             <td>編碼</td>
          </thead>
          {% for row in rows %}
             <tr>
                <td>{{row["name"]}}</td>
                <td>{{row["addr"]}}</td>
                <td>{{row["city"]}}</td>
                <td>{{row['pin']}}</td>
             </tr>
          {% endfor %}
       </table>
    </body>
 </html>

啟動(dòng)Flask程序,訪問(wèn)http://127.0.0.1:5000/create寫(xiě)入數(shù)據(jù)孩革,如下圖所示:

點(diǎn)擊提交就會(huì)跳轉(zhuǎn)http://127.0.0.1:5000/addstudent并顯示:操作結(jié)果 : 數(shù)據(jù)添加成功岁歉。

訪問(wèn)http://127.0.0.1:5000/show,如下圖所示:

好了,F(xiàn)lask框架——Flask-SQLite數(shù)據(jù)庫(kù)就講到這里了锅移,感謝觀看熔掺,下篇文章我們學(xué)習(xí)Flask框架——Flask Sijax。

公眾號(hào):白巧克力LIN

該公眾號(hào)發(fā)布Python非剃、數(shù)據(jù)庫(kù)置逻、Linux、Flask备绽、自動(dòng)化測(cè)試券坞、Git等相關(guān)文章!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肺素,一起剝皮案震驚了整個(gè)濱河市恨锚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倍靡,老刑警劉巖猴伶,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塌西,居然都是意外死亡他挎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)捡需,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)办桨,“玉大人,你說(shuō)我怎么就攤上這事站辉∧刈玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵庵寞,是天一觀的道長(zhǎng)狸相。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捐川,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任逸尖,我火速辦了婚禮古沥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娇跟。我一直安慰自己岩齿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布苞俘。 她就那樣靜靜地躺著盹沈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吃谣。 梳的紋絲不亂的頭發(fā)上乞封,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天做裙,我揣著相機(jī)與錄音,去河邊找鬼肃晚。 笑死锚贱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的关串。 我是一名探鬼主播拧廊,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晋修!你這毒婦竟也來(lái)了吧碾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤墓卦,失蹤者是張志新(化名)和其女友劉穎滤港,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體趴拧,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溅漾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了著榴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添履。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脑又,靈堂內(nèi)的尸體忽然破棺而出暮胧,到底是詐尸還是另有隱情,我是刑警寧澤问麸,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布往衷,位于F島的核電站,受9級(jí)特大地震影響严卖,放射性物質(zhì)發(fā)生泄漏席舍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一哮笆、第九天 我趴在偏房一處隱蔽的房頂上張望来颤。 院中可真熱鬧,春花似錦稠肘、人聲如沸福铅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)滑黔。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間略荡,已是汗流浹背庵佣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撞芍,地道東北人秧了。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像序无,于是被迫代替她去往敵國(guó)和親验毡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容