天天看點

Flask連接配接sqlite3資料庫

Flask是一個輕量版的python架構。本文從以下兩部分描述怎麼連接配接sqlite3資料庫。

一、建立新table到sqlite3

    1. 建立一個.sql檔案(可以先建txt文檔,修改字尾名,比如改成schema.sql)

    schema.sql是模式資料庫檔案,内容是建立table的語句。如果資料已經存在同名的table會先删除再建立。

DROP TABLE IF EXISTS students;
CREATE TABLE students(
    name TEXT PRIMARY KEY,
    address TEXT,
    city TEXT,
    pin TEXT
);
           

    2.在啟動檔案裡添加初始化的函數init_db()(我的啟動檔案是hello.py)

    init_db()是建立table到資料庫,其他可是連接配接和關閉資料庫連接配接,可根據自己的需求改動。

    init_db()需要在python解釋器中運作一次就好了。

from flask import g #g對象可以使用before_request()和teardown_request(),即請求開始前和結束後
import sqlite3

DATABASE_INITFILE = os.path.join(PROJECT_ROOT, "schema.sql")

def connect_db():
    db = getattr(g, 'db', None)
    if db is None:
        db = g.db = sqlite3.connect(DATABASE)
    return db

def init_db(): #使用資料庫模組化檔案初始化資料庫,在指令行中使用一次即可。
    print(".sql file path:{}".format(DATABASE_INITFILE))
    with app.app_context():
        db = connect_db()
        with app.open_resource(DATABASE_INITFILE, mode='r') as f:
            db.cursor().executescript(f.read())
        db.commit()

@app.before_request
def before_request():
    g.db=connect_db()

@app.teardown_request
def close_db(exception):
    if hasattr(g, 'db'):
        g.db.close()
           

    啟動flask項目,在python解釋器裡輸入一下指令,沒有報錯,基本上檢視資料庫就有了建立的table(我用的是pycharm)

Flask連接配接sqlite3資料庫
Flask連接配接sqlite3資料庫

二、查詢sqlite3的table資料

    1.如果隻是查詢資料庫,sqlite3用戶端連接配接資料庫的時候會生成一個.db字尾的檔案,找到這個檔案,複制到flask項目中。(注意連接配接資料庫的時候,類型選擇SQLite3)

    2.插入、查詢資料,函數定義如下:(hello.py檔案添加如下代碼)

DATABASE = os.path.join(PROJECT_ROOT, "data.db")

def insert(name, addr, city, pin):
    sql = "insert into students values (?, ?, ?, ?)"
    conn = g.db
    cursor = conn.cursor()
    try:
        cursor.execute(sql, (name, addr, city, pin))
        conn.commit()
    except Exception as e:
        conn.rollback()
        raise TypeError("insert error:{}".format(e)) #抛出異常

def query_db(query, args=(), one=False):
    cur=g.db.execute(query, args)
    rv=[dict((cur.description[idx][0], value) for idx,value in enumerate(row)) for row in cur.fetchall()]
    return (rv[0] if rv else None) if one else rv
           

    3.定義模闆和視圖通路資料庫資料

    hello.py檔案添加如下代碼:

@app.route('/student') #增加學生資訊頁面
def student():
    return render_template('student.html') 

@app.route('/add', methods=['POST','GET'])
def add():
    if request.method=='POST':
        name = request.form['name']
        address = request.form['address']
        city = request.form['city']
        pin = request.form['pin']

        try:
            insert(name, address, city, pin)
            return redirect(url_for('result'))
        except Exception as e:
            flash("{}".format(e))
            return redirect(url_for('student'))

@app.route('/result') #所有學生資訊list頁面
def result():
    rows=query_db("select * from students")
    return render_template('result.html', rows=rows) 
           

  student.html檔案代碼如下:

<!DOCTYPE html>
<html >
<head>
    <meta charset="utf-8">
    <title>學生資訊</title>
</head>
<body>
    <form action="{{ url_for('add') }}" method="post">
        <h3>學生資訊
            {% with msgs=get_flashed_messages() %}
                {% if msgs %}
                    {% for msg in msgs %}
                        <p style="color:red;">{{ msg }}</p>
                    {% endfor %}
                {% endif %}
            {% endwith %}
        </h3>
        <p>Name <input type = "text" name = "name" /></p>
        <p>address <textarea type = "text" name = "address"></textarea></p>
        <p>city <input type = "text" name = "city" /></p>
        <p>pin <input type ="text" name = "pin" /></p>
        <p><input type = "submit" value = "submit" /></p>
    </form>
</body>
</html>
           

result.html檔案代碼如下:

<!DOCTYPE html>
<html >
<head>
    <meta charset="utf-8">
    <title>學生資訊清單</title>
</head>
<body>
    <table >
        <thead>
            <td>Name</td>
            <td>Address</td>
            <td>City</td>
            <td>Pin</td>
        </thead>
        {% for row in rows %}
        <tr>
            <th>{{ row["name"] }}</th>
            <td>{{ row["address"] }}</td>
            <td>{{ row["city"] }}</td>
            <td>{{ row["pin"] }}</td>
        </tr>
        {% endfor %}
    </table>

    <a href = "/student">Go back to add page</a>
</body>
</html>
           

啟動flask項目,通路網址http://localhost:5000/student,填寫學生資訊,送出即新增資料。成功自動跳轉到http://localhost:5000/result頁面;不成功,在目前頁面顯示error。

直接通路http://localhost:5000/result頁面,檢視所有學生資訊