python大佬養成計劃----flask_sqlalchemy操做數據庫

flask_sqlalchemy

使用對象關係映射(Object-Relational Mapper, ORM)框架,它將低層的數據庫操做指令抽象成高層的面向對象操做。也就是說,若是咱們直接使用數據庫引擎,咱們就要寫 SQL 操做語句,可是,若是咱們使用了 ORM 框架,咱們對諸如表、文檔此類的數據庫實體就能夠簡化成對 Python 對象的操做python

SQLAlchemy已經成爲了python世界裏面orm的標準,flask是一個輕巧的web框架,能夠自由的使用orm,其中flask-sqlalchemy是專門爲flask指定的插件。mysql

在 Flask-SQLAlchemy 中,數據庫使用 URL 指定。web

MySQL -->  mysql://username:password@hostname/database

安裝sql

pip install flask-sqlalchemy

對數據庫操做

1. 如何建立數據庫操做鏈接

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/zaj_sql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

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)

爲了建立初始數據庫,調用 SQLAlchemy.create_all() 方法來建立表和數據庫:數據庫

db.create_all()

您的數據庫已經生成。如今來建立一些用戶flask

admin = User('admin', 'admin@example.com')
guest = User('guest', 'guest@example.com')

可是它們尚未真正地寫入到數據庫中,所以讓咱們來確保它們已經寫入到數據庫中bootstrap

db.session.add(admin)
db.session.add(guest)
db.session.commit()

2.建立關係型數據庫表

SQLAlchemy 鏈接到關係型數據庫,關係型數據最擅長的東西就是關係。所以,咱們將建立一個使用兩張相互關聯的表的應用做爲例子。
最爲常見的關係就是一對多的關係。由於關係在它們創建以前就已經聲明,您能夠使用 字符串來指代尚未建立的類
關係使用 relationship() 函數表示。然而外鍵必須用類 sqlalchemy.schema.ForeignKey 來單獨聲明.session

from datetime import datetime
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
import pymysql
from sqlalchemy import desc

app = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/zaj_sql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
bootstrap = Bootstrap(app)

class User(db.Model):
    id = db.Column(db.Integer,autoincrement=True,primary_key=True)
    name = db.Column(db.String(50),unique=True)
    passwd = db.Column(db.String(100))
    add_time = db.Column(db.DATETIME,default=datetime.now())
    gender = db.Column(db.BOOLEAN,default=True)
    role_id = db.Column(db.INTEGER,db.ForeignKey('role.id'))

    def __repr__(self):
        return '<User:%s>' %(self.name)

class Role(db.Model):
    id = db.Column(db.INTEGER,autoincrement=True,primary_key=True)
    name = db.Column(db.String(50),unique=True)
    users = db.relationship('User',backref='role')
    # 給Role模型添加users屬性
    # backref 是定義反向引用
        def __repr__(self):
        return '<Role:%s>' % (self.name)
if __name__ =='__main__':
    # 1. 建立數據庫表
    # db.drop_all()
    # db.create_all()
    # # 2. 建立role數據庫表數據
    role_1 = Role(name='超級會員')
    role_2 = Role(name='普通會員')

    db.session.add(role_1)
    db.session.add(role_2)

    db.session.commit()

    # # # 3. 添加user表內數據,100個用戶,50個爲超級會員,50個爲普通會員
    for i in range(1,13):
        if i%2 == 0:
            u = User(name='sheen'+str(i),passwd='sheen',role_id=1)
            db.session.add(u)
        else:
            u = User(name='star'+str(i),passwd='star',role_id=2)
            db.session.add(u)
    db.session.commit()

backref 是定義反向引用,能夠經過User.role訪問Role對象和屬性。
圖片描述
圖片描述
查詢全部數據app

print('角色',Role.query.all())
    print('用戶',User.query.all())

根據條件查詢數據框架

# select * from tablename where xxx=xxxxx
    print(User.query.filter_by(role_id=1).all())
    print(Role.query.filter_by().all())
    print(User.query.filter_by(role_id=2).all())

圖片描述
對於找到的數據進行更新

print('進行數據更新',end='\n')
    u =User.query.filter_by(name='sheen2').first()
    print(u)
    u.passwd = '123'
    db.session.add(u)
    db.session.commit()

圖片描述
篩選數據方法2(filter),這種方法能夠看見原生的sql語句

print('數據篩選', end='\n')
    user = User.query.filter(User.role_id==1)
    print(user)

圖片描述
對於查詢的信息進行顯示限制

print('限制查詢數據的顯示', end='\n')

    users = User.query.filter_by(role_id=1).limit(3).all()
    print(users)

對於查詢的信息進行排序輸出(默認狀況由小到大進行排序), 若是想要由大到小: desc(User.add_time)

print('數據再處理', end='\n')
    users = User.query.filter_by(role_id=1).order_by(desc(User.name)).all()
    print(users)

多個過濾函數

print('多個過濾函數', end='\n')
    users = User.query.filter_by(role_id=1).order_by(desc(User.name)).limit(3).offset(1).all()
    print(users)
    users = User.query.filter_by(role_id=1).order_by(desc(User.name)).slice(1,4).all()
    print(users)

圖片描述
分頁,第一個參數表示顯示第幾頁數據,第二個參數表示每頁顯示多少條數據

print('分頁顯示', end='\n')

    users = User.query.paginate(1,5)
    print(users.items)
    users = User.query.paginate(2, 5)
    print(users.items)

圖片描述

相關文章
相關標籤/搜索