使用Flasky-SQLAlchemy 管理數(shù)據(jù)庫
本文主要解決那本《Flask Web開發(fā) 基于Python的Web應(yīng)用開發(fā)實戰(zhàn)》
這本書坑不少嗦玖,書是挺好的,但是你會踩不少坑拍屑,導致你會有很多bug,即使你復制的源代碼。
先來一段代碼
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import os
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' +\
os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_TEARDOWN'] = True
#app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
@app.route('/')
def index():
return "Hello world"
if __name__ == '__main__':
app.run()
注意,我在app.config中有一行是打了注釋的冗疮。
如果加了注釋:效果如下:
它會顯示一個warning。一個警告
如果那一行去掉注釋檩帐,效果如下:
這樣子警告就消失了术幔。
接下來,為數(shù)據(jù)庫建個表湃密,簡單起見诅挑,表中就兩個字段,一個id泛源,一個username拔妥,
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64))
@app.route('/')
def index():
u = User(username='zhangsan')
return u.username
看上去還可以。
再換個方式达箍。真正把用戶數(shù)據(jù)(就是那個變量u)添加到數(shù)據(jù)庫去.
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import os
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' +\
os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64))
@app.route('/')
def index():
u = User(username='zhangsan')
db.session.add(u)
return User.query.filter_by(username='zhangsan').first().username
if __name__ == '__main__':
# db.drop_all()
# db.create_all()
app.run()
注意看在最下面没龙,注釋的那兩行,如果注釋掉的話缎玫,你去運行硬纤,會出現(xiàn)一個500的錯誤
這是你仔細觀察目錄中的文件,多了一個名字叫:data.sqlite的文件赃磨,然后你去查看這個文件的內(nèi)容筝家,
你會發(fā)現(xiàn)里面什么都沒有。
原因很簡單煞躬,因為數(shù)據(jù)庫的表你根本就還沒有創(chuàng)建呢肛鹏,所在在最下面if里面的兩行,是為了創(chuàng)建表用的恩沛。
估計大多數(shù)人被這個坑了在扰。
當我們把注釋解除之后.
這個樣子就有東西了。
所以總的來說雷客,當你去按照那個書學習的時候芒珠,如果打開localhost:5000之后出現(xiàn)SQLAlchemy的Error的時候
,先去看看有沒有那個.sqlite文件(一般都有),然后去看看里面有沒有東西搅裙,如果沒有請按照如下方式:
這里假設(shè)你的db變量所在文件為:manage.py
python3 manage.py shell
>>>from manage import db
>>>db.drop_all()
>>>db.create_all()