使用Flasky-SQLAlchemy 管理資料庫

weixin_33670713發表於2017-08-03

使用Flasky-SQLAlchemy 管理資料庫

本文主要解決那本《Flask Web開發 基於Python的Web應用開發實戰》
這本書坑不少,書是挺好的,但是你會踩不少坑,導致你會有很多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中有一行是打了註釋的。
如果加了註釋:效果如下:

3308539-54d3d5d412e9cb7f.png

它會顯示一個warning。一個警告

如果那一行去掉註釋,效果如下:


3308539-f982d77acc1f83ee.png

這樣子警告就消失了。

接下來,為資料庫建個表,簡單起見,表中就兩個欄位,一個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
3308539-550a78ad3bc385a5.png

看上去還可以。
再換個方式。真正把使用者資料(就是那個變數u)新增到資料庫去.

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()

注意看在最下面,註釋的那兩行,如果註釋掉的話,你去執行,會出現一個500的錯誤


3308539-78fb52f569e0dcfa.png

這是你仔細觀察目錄中的檔案,多了一個名字叫:data.sqlite的檔案,然後你去檢視這個檔案的內容,
你會發現裡面什麼都沒有。
原因很簡單,因為資料庫的表你根本就還沒有建立呢,所在在最下面if裡面的兩行,是為了建立表用的。
估計大多數人被這個坑了。

當我們把註釋解除之後.

3308539-550a78ad3bc385a5.png

3308539-c9ee5a051688429e.png

這個樣子就有東西了。

所以總的來說,當你去按照那個書學習的時候,如果開啟localhost:5000之後出現SQLAlchemy的Error的時候
,先去看看有沒有那個.sqlite檔案(一般都有),然後去看看裡面有沒有東西,如果沒有請按照如下方式:

這裡假設你的db變數所在檔案為:manage.py

python3 manage.py shell

>>>from manage import db
>>>db.drop_all()
>>>db.create_all()

相關文章