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)
二、查詢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頁面,檢視所有學生資訊