flask-sqlalchemy是flask的一個ORM擴展框架,這個擴展在sqlalchemy的進行的擴展,更方便的結合Flask.
什麼是ORM?
其是Object Relational Mapping的縮寫,中文:對象關係映射,說白了就是程序中的實體類經過ORM能夠映射成爲數據庫中的表,方便咱們經過程序的方式操做數據表,這裏就包括數據表的生成、刪除、關係建立及表記錄的增刪改查。
【config.py】mysql
SQLALCHEMY_DATABASE_URI='mysql://root:mysql@127.0.0.1:3306/test' //數據庫鏈接 SQLALCHEMY_TRACK_MODIFICATIONS=False
上面兩項是必配置的屬性,不然程序將不能正常運行:全部配置鍵見最後sql
【create_sur.py】數據庫
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app) app.config.from_object('config.py') class User(db.Model): __tablename__ = 'user' #指定表名,默認模型類小寫 id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(32)) def __repr__(self): return 'Role:%s' % self.name if __name__ == "__main__": db.create_all() app.run()
這樣子在test數據庫下就生成了一張user表,是否是很簡單。
在進行數據的增刪改查以前,咱們先來看一下經常使用的操做語句:flask
>>>from create_sur import db,User >>>user1=User(name='jim') >>>db.session.add(user1) >>>db.session.commit() //添加一條數據 >>>user2=User(name='sam') >>>user3=User(name='alice') >>>db.session.add_all([user2,user3]) //批量添加數據 >>>db.session.commit()
>>>from create_sur import db,User >>>user_all=User.query.all() //查詢全部數據 >>>user=User.query.filter_by(name='jim').all() //查詢name爲jim的數據 >>>user=User.query.filter(User.name='sam').first() //查詢name爲sam的數據
經常使用過濾函數:
session
經常使用查詢函數:app
//在查詢數據的基礎上 >>>db.session.delete(obj) //obj爲查詢後的數據對象 >>>db.session.commit()
//在查詢數據的基礎上經過修改對象的屬性而後再添加達到更新的做用 >>>user=User.query.filter(User.name='sam').first() //查詢數據 >>>user.name='sam_two' >>>db.session.add(user) >>>db.session.commit()
上面是一些簡單的小例子,接下來咱們寫一個有外鍵關係的兩個表的例子:
【create_sur2.py】框架
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app) app.config.from_object('config.py') class Role(db.Model): # 定義表名 __tablename__ = 'roles' # 定義列對象 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) #設置關係屬性,方便查詢使用 us = db.relationship('User', backref='role') #重寫__repr__方法,方便查看對象輸出內容 def __repr__(self): return 'Role:%s'% self.name class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True, index=True) password = db.Column(db.String(64)) role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) #定義外鍵 def __repr__(self): return 'User:%s'%self.name
上述有兩個重點:函數
接下來咱們測試一下這兩個方法的做用:測試
添加一些數據: >>>from create_sur2 import db,User,Role >>>ro1 = Role(name='admin') >>>ro2 = Role(name='user') >>>db.session.add_all([ro1,ro2]) >>>db.session.commit() >>>us1 = User(name='wang', password='123456', role_id=ro1.id) >>>us2 = User(name='zhang', password='201512', role_id=ro2.id) >>>us3 = User(name='chen', password='987654', role_id=ro2.id) >>>us4 = User(name='zhou', password='456789', role_id=ro1.id) >>>db.session.add_all([us1,us2,us3,us4]) >>>db.session.commit() 測試一下查詢: >>>from create_sur2 import User,Role >>>role=Role.query.get(1) >>>role.User.all() [User:wang,User:zhou] 這裏之因此能夠找到就是由於relationship經過外鍵做用實現的 >>>user=User.query.get(3) >>>user.role [Role:user] 這裏之因此能夠找到就是由於relationship的backref參數值實現的
SQLALCHEMY_DATABASE_URI 用於鏈接的數據庫 URI
SQLALCHEMY_BINDS 一個映射 binds 到鏈接 URI 的字典
SQLALCHEMY_ECHO 若是設置爲Ture, SQLAlchemy 會記錄全部 發給 stderr 的語句,這對調試有用。(打印sql語句)
SQLALCHEMY_RECORD_QUERIES 能夠用於顯式地禁用或啓用查詢記錄。查詢記錄 在調試或測試模式自動啓用。更多信息見get_debug_queries()。
SQLALCHEMY_NATIVE_UNICODE 能夠用於顯式禁用原生 unicode 支持。當使用 不合適的指定無編碼的數據庫默認值時,這對於 一些數據庫適配器是必須的(好比 Ubuntu 上 某些版本的 PostgreSQL )。
SQLALCHEMY_POOL_SIZE 數據庫鏈接池的大小。默認是引擎默認值(一般 是 5 )
SQLALCHEMY_POOL_TIMEOUT 設定鏈接池的鏈接超時時間。默認是 10 。
SQLALCHEMY_POOL_RECYCLE 多少秒後自動回收鏈接。這對 MySQL 是必要的, 它默認移除閒置多於 8 小時的鏈接。注意若是 使用了 MySQL , Flask-SQLALchemy 自動設定 這個值爲 2 小時。編碼