Flask-SQLAlchemy使用起來很是有趣,對於基本應用十分容易使用,而且對於大型項目易於擴展。有關完整的指南,請參閱 SQLAlchemy 的 API 文檔。python
常見狀況下對於只有一個 Flask 應用,全部咱們須要作的事情就是建立 Flask 應用,選擇加載配置接着建立 SQLAlchemy 對象時候把 Flask 應用傳遞給它做爲參數。sql
一旦建立,這個對象就包含 sqlalchemy 和 sqlalchemy.orm 中的全部函數和助手。此外它還提供一個名爲 Model 的類,用於做爲聲明模型時的 delarative 基類:shell
from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy app = Flask(name) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True) def __init__(self, username, email): self.username = username self.email = email def __repr__(self): return '<User %r>' % self.username
爲了建立初始數據庫,只須要從交互式 Python shell 中導入 db 對象而且調用 SQLAlchemy.create_all() 方法來建立表和數據庫:數據庫
from yourapplication import db db.create_all()
數據庫已經生成。如今來建立一些用戶:flask
from yourapplication import User admin = User('admin', 'admin@example.com') guest = User('guest', 'guest@example.com')
可是它們尚未真正地寫入到數據庫中,所以讓咱們來確保它們已經寫入到數據庫中:session
db.session.add(admin) db.session.add(guest) db.session.commit()
訪問數據庫中的數據也是十分簡單的:app
users = User.query.all() [<User u'admin'>, <User u'guest'>] admin = User.query.filter_by(username='admin').first() <User u'admin'>
簡單的關係函數
SQLAlchemy 鏈接到關係型數據庫,關係型數據最擅長的東西就是關係。所以,咱們將建立一個使用兩張相互關聯的表的應用做爲例子:post
from datetime import datetime
class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80)) body = db.Column(db.Text) pub_date = db.Column(db.DateTime) category_id = db.Column(db.Integer, db.ForeignKey('category.id')) category = db.relationship('Category',backref=db.backref('posts', lazy='dynamic')) def __init__(self, title, body, category, pub_date=None): self.title = title self.body = body if pub_date is None: pub_date = datetime.utcnow() self.pub_date = pub_date self.category = category def __repr__(self): return '<Post %r>' % self.title class Category(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) def __init__(self, name): self.name = name def __repr__(self): return '<Category %r>' % self.name
首先讓咱們建立一些對象:測試
py = Category('Python') p = Post('Hello Python!', 'Python is pretty cool', py) db.session.add(py) db.session.add(p)
如今由於咱們在 backref 中聲明瞭 posts 做爲動態關係,查詢顯示爲:
py.posts <sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x1027d37d0>
它的行爲像一個普通的查詢對象,所以咱們能夠查詢與咱們測試的 「Python」 分類相關的全部文章(posts):
py.posts.all() [<Post 'Hello Python!'>]
咱們僅須要知道與普通的 SQLAlchemy 不一樣之處: