Flask擴展之flask-sqlalchemy(上)

flask-sqlalchemy是flask的一個ORM擴展框架,這個擴展在sqlalchemy的進行的擴展,更方便的結合Flask.
什麼是ORM?
其是Object Relational Mapping的縮寫,中文:對象關係映射,說白了就是程序中的實體類通過ORM可以映射成爲數據庫中的表,方便我們通過程序的方式操作數據表,這裏就包括數據表的生成刪除關係創建及表記錄的增刪改查
【config.py】

SQLALCHEMY_DATABASE_URI='mysql://root:[email protected]:3306/test'    //數據庫連接

SQLALCHEMY_TRACK_MODIFICATIONS=False

上面兩項是必配置的屬性,否則程序將不能正常運行:所有配置鍵見最後

【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表,是不是很簡單。
在進行數據的增刪改查之前,我們先來看一下常用的操作語句:

常見操作語句

  1. db.session.add(obj) 添加對象
  2. db.session.add_all([obj1,obj2,..]) 添加多個對象
  3. db.session.delete(obj) 刪除對象
  4. db.session.commit() 提交會話
  5. db.session.rollback() 回滾
  6. db.session.remove() 移除會話

增加數據

>>>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的數據

常用過濾函數:
clipboard.png

常用查詢函數:

clipboard.png

刪除數據

//在查詢數據的基礎上
>>>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

上述有兩個重點:

  1. 使用ForeignKey義外鍵屬性
  2. 使用relationship方法定義兩表的關係

接下來我們測試一下這兩個方法的作用:

添加一些數據:
>>>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 小時。

所有數據類型

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章