【Falsk 使用資料庫】---- 資料庫基本操作

向鯨訴 ひ聽風說'發表於2020-12-20

【Falsk 使用資料庫】---- 資料庫基本操作


目錄:

一、查詢操作

二、增、刪、改操作
    1.資料增加
    2.資料刪除
    3.資料修改

三、關係引用

四、實現簡單的查詢
    1.查詢所有使用者資訊
    2.查詢有多少個使用者
    3.查詢第一個使用者
    4.查詢id為3的使用者 ---- 3種方式


一、查詢操作

  • 通過對模型類的query屬性呼叫可選的過濾方法,我們就可以獲取到單個或多個記錄(記錄以模型類的例項表示)。查詢語句如下:
<模型類>.query.<過濾方法(可選)>.<查詢方法>

下面是一些常用的過濾方法:

  • filter():使用指定的規則過濾記錄,返回新產生的查詢物件
  • filter_by():使用指定規則過濾記錄(以關鍵字表示式的形式),返回新產生的查詢物件
  • order_by():根據指定條件對記錄進行排序,返回新產生的查詢物件
  • group_by():根據指定條件對記錄進行分組,返回新的查詢物件

下面是一些常用的查詢方法:

  • all():返回包含所有查詢記錄的列表
  • first():返回查詢的第一條記錄,如果未找到,則返回None
  • get(id):傳入主鍵值作為引數,返回指定主鍵值的記錄,如果未找到,則返回None
  • count():返回查詢結果的數量
  • first_or_404():返回查詢的第一條記錄,如果未找到,則返回404錯誤響應
  • get_or_404(id):傳入主鍵值作為引數,返回指定主鍵值的記錄,如果未找到,則返回404錯誤響應
  • paginate():返回一個Pagination物件,可以對記錄進行分頁處理
if __name__ == '__main__':

    # 查詢
    # select * from users where users.name='Tom';
    user = User.query.filter(User.name == 'Tom')
    print(user)
    user = User.query.filter(User.name == 'Tom').all()
    print(user)

    # 提交會話
    db.session.commit()
    # 執行
    app.run(debug=True)

在這裡插入圖片描述

返回頂部


二、增、刪、改操作

基本概念

  • 在Flask-SQLAlchemy中,插入、修改、刪除操作,均由資料庫會話管理
    • 會話用db.session表示。在準備把資料寫入資料庫前,要先將資料新增到會話中然後呼叫commi()方法提交會話
  • 在Flask-SOLAlchemy中,查詢操作是通過query物件運算元據
    • 最基本的查詢是返回表中所有資料,可以通過過濾器進行更精確的資料庫查詢
db.session.add(role)  新增到資料庫的session中
db.session.add_all([user1,user2]) 新增多個資訊到session中
db.sessica.commit()     提交資料庫的修改(包括增、刪、改)
db.session.rollback()     資料庫的回滾操作
db.session.delete(user) 刪除資料庫(需要跟上commit)

1.資料增加

  • db.session.add(role) 新增單個資訊到資料庫的session中
  • db.session.add_all([user1,user2]) 新增多個資訊以list的形式到session中
if __name__ == '__main__':
    # 刪除原有
    db.drop_all()
    # 建立新的表
    db.create_all()

    # 插入資料
    # roles表
    role1 = Role(id=1, role="admin")
    role2 = Role(id=2, role="common_user")
    # 新增到session中
    db.session.add_all([role1, role2])
    # 提交會話
    db.session.commit()
    # users表
    user1 = User(id=1, name="Jack", role_id=2)
    user2 = User(id=2, name="Tom", role_id=1)
    user3 = User(id=3, name="Alice", role_id=2)
    # 新增到session中
    db.session.add_all([user1,user2,user3])
    # 提交會話
    db.session.commit()
    # 執行
    app.run(debug=True)

結果展示
在這裡插入圖片描述
返回頂部


2.資料刪除

  • 獲取到要刪除的記錄
    user = User.query.get(3)
    注意:查詢記錄get的引數是主鍵的值,這裡要查詢users表中主鍵值為1的記錄
  • 定義刪除
    db.session.delete(user)
  • 提交會話
    db.session.commit()
# -*- coding: utf-8
#  @Time    : 2020/12/19 11:30
#  @Author  : ZYX
#  @File    : data_delete.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 建立Flask物件
app = Flask(__name__)
# 配置資料庫資訊
# 資料庫地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟蹤資料庫的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 建立資料庫物件
db = SQLAlchemy(app)

'''
建立兩張表:使用者表、使用者身份表
其中通過id將使用者與身份關聯起來
'''
# 建立資料庫模型,需要繼承自 db.Model
class Role(db.Model):
    # 定義表名
    __tablename__ = "roles"
    # 定義欄位及其屬性
    # db.Model 表示是一個欄位
    id = db.Column(db.Integer, primary_key=True)  # id欄位,int型別,主鍵
    role = db.Column(db.String(16), unique=True)  # name欄位,string型別,唯一

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    # db.ForeignKey("roles.id") 表示是一個外來鍵,宣告時需要指定:表名.欄位名
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))  # 宣告該欄位為roles的外來鍵

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    # 查詢出要刪除的資料
    user = User.query.get(3)
    print(user)
    # 定義刪除
    db.session.delete(user)
    # 提交會話
    db.session.commit()
    # 執行
    app.run(debug=True)

在這裡插入圖片描述
注意:在刪除的時候使用該方法後會報錯,但是查詢結果顯示已經執行了刪除操作,網上查詢也沒找到正確的解釋,稍後會更新~
在這裡插入圖片描述
返回頂部


3.資料修改

  • 獲取到要修改的記錄
    user = User.query.get(1)
    注意:查詢記錄get的引數是主鍵的值,這裡要查詢users表中主鍵值為1的記錄
  • 定義修改的內容
    user.name = "li"
  • 提交會話
    db.session.commit()
# -*- coding: utf-8
#  @Time    : 2020/12/19 10:38
#  @Author  : ZYX
#  @File    : data_update.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 建立Flask物件
app = Flask(__name__)
# 配置資料庫資訊
# 資料庫地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟蹤資料庫的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 建立資料庫物件
db = SQLAlchemy(app)

'''
宣告兩張表及其結構:使用者表、使用者身份表
其中通過id將使用者與身份關聯起來
'''
# 建立資料庫模型,需要繼承自 db.Model
class Role(db.Model):
    # 定義表名
    __tablename__ = "roles"
    # 定義欄位及其屬性
    # db.Model 表示是一個欄位
    id = db.Column(db.Integer, primary_key=True)  # id欄位,int型別,主鍵
    role = db.Column(db.String(16), unique=True)  # name欄位,string型別,唯一


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    # db.ForeignKey("roles.id") 表示是一個外來鍵,宣告時需要指定:表名.欄位名
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))  # 宣告該欄位為roles的外來鍵

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    # 取到要修改的記錄
    user = User.query.get(1)
    # 定義修改的內容
    user.name = "li"
    # 提交會話
    db.session.commit()
    # 執行
    app.run(debug=True)

在這裡插入圖片描述
返回頂部


注意:在編寫程式的時候需要宣告表的結構
在這裡插入圖片描述
返回頂部


三、關係引用

在這裡插入圖片描述
僅僅為了方便查詢,我們需要一些屬性便利地去查詢資料,但是又不想讓這些屬性出現在資料庫的欄位中。比如:我們想直接通過user查詢出使用者所屬的角色名,一般都是先查詢出使用者對應的角色編號,通過編號到Role表中去查詢對應的角色。

# -*- coding: utf-8
#  @Time    : 2020/12/20 8:36
#  @Author  : ZYX
#  @File    : data_relationship.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 建立Flask物件
app = Flask(__name__)
# 配置資料庫資訊
# 資料庫地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟蹤資料庫的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 建立資料庫物件
db = SQLAlchemy(app)

'''
建立兩張表:使用者表、使用者身份表
其中通過id將使用者與身份關聯起來
'''
# 建立資料庫模型,需要繼承自 db.Model
class Role(db.Model):
    # 定義表名
    __tablename__ = "roles_rs"
    # 定義欄位及其屬性
    # db.Model 表示是一個欄位
    id = db.Column(db.Integer, primary_key=True)  # id欄位,int型別,主鍵
    role = db.Column(db.String(16), unique=True)  # name欄位,string型別,唯一

    # 新增關聯
    # users = db.relationship('User', backref='role') 表示和User模型發生了關聯,增加了一個users屬性
    # backref = 'role' 反向引用,表示role是User要用的屬性
    users = db.relationship('User',backref ='role')

    # repr()方法顯示一個可讀的字串
    def __repr__(self):
        return '<Role:%s %s>' % (self.role,self.id)


class User(db.Model):
    __tablename__ = "users_rs"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    email = db.Column(db.String(32),unique=True)
    password = db.Column(db.String(32))
    # db.ForeignKey("roles.id") 表示是一個外來鍵,宣告時需要指定:表名.欄位名
    role_id = db.Column(db.Integer, db.ForeignKey("roles_rs.id"))  # 宣告該欄位為roles的外來鍵
    # User希望有role屬性,但是這個屬性的定義,需要在另一個模型中定義

    # repr()方法顯示一個可讀的字串,相當於重寫toString
    def __repr__(self):
        return '<User:%s %s %s %s >' % (self.id,self.name,self.email,self.password)

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    # 新增元素
    role1 = Role(id=1,role="admin")
    role2 = Role(id=2, role="user")
    db.session.add_all([role1,role2])
    # 提交會話
    db.session.commit()
    # 新增元素
    user1 = User(id=1,name="Tom",email="1442314632@.qq.com",password="123",role_id=2)
    user2 = User(id=2,name="Jack",email="3519232933@.qq.com",password="123",role_id=1)
    db.session.add_all([user1,user2])
    # 提交會話
    db.session.commit()
    # 執行
    app.run(debug=True)

  • users = db.relationship('User', backref='role') 表示和User模型發生了關聯,增加了一個users屬性
  • backref = 'role' 反向引用,表示role是User方便查詢時要用的屬性
# 新增關聯
 users = db.relationship('User',backref ='role')

通過表的生成也可以看出,relationship宣告的欄位並不會被真正的新增到表中!!!
在這裡插入圖片描述

  • 查詢
if __name__ == '__main__':

    # 查詢
    # 查詢id為1的使用者資訊
    user = User.query.filter(User.id == 1).first()
    # 查詢所有Role模型內的資料列表
    role = Role.query.all()
    # 輸出user查詢結果
    print(user)
    # 輸出關聯後的快速查詢結果,id為1的使用者角色是普通使用者,id為2
    print(user.role)
    # 遍歷Role模型資料,輸出對應的使用者資訊
    for each in role:
       print(each.users)
    # 提交會話
    db.session.commit()
    # 執行
    app.run(debug=True)

在這裡插入圖片描述
返回頂部


四、實現簡單的查詢

  • 創表插入資料
# -*- coding: utf-8
#  @Time    : 2020/12/20 9:57
#  @Author  : ZYX
#  @File    : data_query.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 建立Flask物件
app = Flask(__name__)
# 配置資料庫資訊
# 資料庫地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟蹤資料庫的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 建立資料庫物件
db = SQLAlchemy(app)

'''
建立兩張表:使用者表、使用者身份表
其中通過id將使用者與身份關聯起來
'''


# 建立資料庫模型,需要繼承自 db.Model
class Role(db.Model):
    # 定義表名
    __tablename__ = "roles_query"
    # 定義欄位及其屬性
    # db.Model 表示是一個欄位
    id = db.Column(db.Integer, primary_key=True)  # id欄位,int型別,主鍵
    role = db.Column(db.String(16), unique=True)  # name欄位,string型別,唯一

    # 新增關聯
    # users = db.relationship('User', backref='role') 表示和User模型發生了關聯,增加了一個users屬性
    # backref = 'role' 反向引用,表示role是User要用的屬性
    users = db.relationship('User', backref='role')

    # repr()方法顯示一個可讀的字串
    def __repr__(self):
        return '<Role:%s %s>' % (self.role, self.id)

class User(db.Model):
    __tablename__ = "users_query"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    email = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    # db.ForeignKey("roles.id") 表示是一個外來鍵,宣告時需要指定:表名.欄位名
    role_id = db.Column(db.Integer, db.ForeignKey("roles_query.id"))  # 宣告該欄位為roles的外來鍵
    # User希望有role屬性,但是這個屬性的定義,需要在另一個模型中定義

    # repr()方法顯示一個可讀的字串
    def __repr__(self):
        return '<User:%s %s %s %s >' % (self.id, self.name, self.email, self.password)

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    # 創表
    db.drop_all()
    db.create_all()
    # 插入一條資料
    ro1 = Role(id=1,role='admin')
    db.session.add(ro1)
    db.session.commit()
    # 再次插入一條資料
    ro2 = Role(id=2,role='user')
    db.session.add(ro2)
    db.session.commit()
    us1 = User(id=1, name='Wang', email="wang@163.com", password="123456", role_id=ro1.id)
    us2 = User(id=2, name='Zhang', email='zhang@189.com', password="201512", role_id=ro2.id)
    us3 = User(id=3, name='Chen', email='chen@126.com', password="987654", role_id=ro2.id)
    us4 = User(id=4, name='Zhou', email="zhou@163.com", password="456789", role_id=ro1.id)
    us5 = User(id=5, name='Tang', email="tang@163.com", password='158104', role_id=ro2.id)
    us6 = User(id=6, name='Wu', email='wu@163.com', password='5623514', role_id=ro2.id)
    us7 = User(id=7, name='Qian', email="qian@gmail.com", password='1543567', role_id=ro1.id)
    us8 = User(id=8, name='Liu', email='Liu@itheina.com', password="867322", role_id=ro1.id)
    us9 = User(id=9, name='Li', email="Li@163.com", password="4526342", role_id=ro2.id)
    us10 = User(id=10, name='Sun', email='sun@163.com', password='235523', role_id=ro2.id)
    db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
    db.session.commit()
    # 執行
    app.run(debug=True)

在這裡插入圖片描述

1.查詢所有使用者資訊

if __name__ == '__main__':

    # 1.查詢所有使用者資料
    all_user_info = User.query.all()
    for user in all_user_info:
        print(user)
    # 提交事務
    db.session.commit()
    app.run(debug=True)

在這裡插入圖片描述

返回頂部


2.查詢有多少個使用者

if __name__ == '__main__':

    # 2.查詢有多少個使用者
    users_count = User.query.count()
    print(users_count)

    db.session.commit()
    app.run(debug=True)

在這裡插入圖片描述

返回頂部


3.查詢第一個使用者

if __name__ == '__main__':

    # 3.查詢第一個使用者
    first_user = User.query.first()
    print(first_user)
    
    db.session.commit()
    app.run(debug=True)

在這裡插入圖片描述

返回頂部


4.查詢id為3的使用者 ---- 3種方式

if __name__ == '__main__':

    # 4.查詢id為4的使用者
     user_s1 = User.query.filter(User.id == 4).first()
    user_s2 = User.query.get(4)
    user_s3 = User.query.filter_by(id=4).first()
    print(user_s1)
    print(user_s2)
    print(user_s3)
    # 提交事務
    db.session.commit()
    app.run(debug=True)

在這裡插入圖片描述

返回頂部


相關文章