14、flask-模型-models-表的操作-增刪改查

little小新發表於2024-07-27

1.單表操作

1.修改表結構

接著上一步的資料遷移後、生成了表,接下來就要對錶的操作

這裡稍微對錶結構改了一下
models.py

from .exts import db    #匯入db物件

class User(db.Model):
    # 表名
    __tablename__ = 'user'
    # 欄位
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True)
    age = db.Column(db.Integer, default=1)

注意:修改表結構需要重新做資料遷移的操作:

1.flask db migrate
2.flask db upgrade

2.增加資料

from flask import Blueprint
from .models import *

#建立藍圖(路由)
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'


# 建立物件: 物件名(自定義) = 類名()     -- > 該物件指的是models中的類
# 物件.屬性名 = 表欄位的值

# 單表操作 - 增刪改查
# 1.增
@blue.route('/useradd/')
def user_add():
    # #新增一條資料
    # # 建立物件
    # user = User()
    # user.name = '張三'
    # user.age = 18
    # db.session.add(user)    #將物件user新增到session中
    # db.session.commit()     #將session中的資料提交到資料庫中

    #新增多條資料
    users = []
    for i in range(10, 30):
        user = User()
        user.name = '張' + str(i)
        user.age = i
        users.append(user)

    try:
        db.session.add_all(users)    #將物件user新增到session中, all新增多個物件
        db.session.commit()     #將session中的資料提交到資料庫中  事務提交
    except Exception as e:
        db.session.rollback()   #回滾
        db.session.flush()  #清空session
        return '新增失敗' + str(e)
        #因為這裡name是唯一值、所以如果重複新增會報錯,將錯誤列印出來
        # 新增失敗(sqlite3.IntegrityError) UNIQUE constraint failed: user.name [SQL: INSERT INTO user (name, age) VALUES (?, ?) RETURNING id] [parameters: ('張10', 10)] (Background on this error at: https://sqlalche.me/e/20/gkpj)
    return '新增成功'

3.刪除資料

from flask import Blueprint
from .models import *

#建立藍圖(路由)
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'


# 建立物件: 物件名(自定義) = 類名()     -- > 該物件指的是models中的類
# 物件.屬性名 = 表欄位的值

# 2.刪
# 先查到要刪除的資料,再執行刪除
@blue.route('/userdel/')
def user_del():
    # 先查到要刪除的資料
    user = User.query.first()   #查詢第一條資料
    db.session.delete(user)
    db.session.commit()

    return '刪除成功'

3.改

# 3.改
@blue.route('/userupdate/')
def user_update():
    # 先查到要修改的資料
    user = User.query.first()
    user.age = 200
    db.session.commit()
    return '修改成功'

4.查詢

  • 查詢資料常用屬性
  1. 過濾器
方法名 說明
filter() 把過濾器新增到原查詢上,返回一個新的查詢
filter_by() 把等值過濾器新增到原查詢上,返回一個新查詢
limit() 使用指定的值限制原查詢返回的結果數量,返回一個新查詢
offset() 偏移原查詢返回的結果、返回一個新的查詢
order_by() 根據指定條件對原查詢結果進行排序、預設升序、降序需要匯入from sqlalchemy import desc
group_by() 根據指定條件對原查詢結果進行分組
  1. 常用查詢
方法名 說明
all() 以列表形式返回查詢的所有結果、返回列表
first() 返回查詢的第一個結果、如果沒有結果返回 None
first_or_404() 返回查詢的第一個結果、如果沒有結果、則終止請求、返回404錯誤響應
get() 返回指定主鍵對應的行、如果沒有對應的行、則返回None
get_or_404() 返回指定主鍵對應的行、如果沒有找到指定的主鍵、則終止請求、返回404錯誤響應
count() 返回查詢結果的數量
paginate() 返回一個Paginate物件、他包含指定範圍內的結果 - 一般做翻頁
  1. 查詢屬性
屬性名 說明
contains() 模糊查詢
startswith() 查詢以什麼開頭的
endswitch() 查詢以什麼結尾的
in_ 查詢在列表中的資料
__gt__ 大於
__ge__ 大於等於
__lt__ 小於
__le__ 小於等於
  1. 邏輯運算

需要匯入:from sqlalchemy import and_, or_, not_

  • 與 and_ :filter(and_(條件),條件...)
  • 或 or_ : filter(or_(條件),條件...)
  • 非 not_ : filter(not_(條件),條件)

案例如下:

```plaintext
from flask import Blueprint
from sqlalchemy import desc, and_, or_, not_

from .models import *

#建立藍圖(路由)
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'


# 建立物件: 物件名(自定義) = 類名()     -- > 該物件指的是models中的類
# 物件.屬性名 = 表欄位的值

# 4.查
@blue.route('/userget/')
def user_get():
    # all(): 查詢所有資料
    users = User.query.all()    #查詢所有資料
    # print(users)    #列印的是物件、如果models中有__repr__方法,列印的是物件的屬性值、如果沒有__repr__方法,列印的是物件的記憶體地址
    # print(User.query)   #列印的是sql語句

    # filter(): 過濾, 過濾條件,類似where 、支援鏈式查詢、得到的是查詢集
    users = User.query.filter()
    # print(users)

    # get(): 根據主鍵查詢、如果沒有找到,返回None、
    user = User.query.get(10)
    # print(user)
    # print(user.name, user.age)  # 列印物件的屬性值


    # filter()與filter_by()的區別
    # filter()  # 類似where、支援不等值的條件查詢、但條件要:物件.屬性名
    # filter_by()   #用於等值 = 操作的過濾條件,而不支援 > < 等不等值的條件查詢

    # users = User.query.filter(User.age==18)   #
    #users = User.query.filter(User.age>18)     #返回的是查詢集

    users = User.query.filter_by(age=18)        #可以直接屬性值查詢
    # users = User.query.filter_by(age>18)      #這是不支援的所以會報錯
    # print(list(users))  # 列印查詢集使用list()強轉列印


    # first(): 查詢第一條資料
    # last(): 查詢最後一條資料
    user = User.query.first()
    # user = User.query.last()
    user = User.query.first_or_404()
    print(user.name, user.age)


    # count(): 查詢資料條數
    count = User.query.count()
    print(count)

    # limit(): 查詢指定條數
    # offset(): 查詢指定條數,從指定位置開始
    users = User.query.offset(3).limit(4)
    print(list(users))

    # order_by(): 排序
    users = User.query.order_by('age')  # 升序
    users = User.query.order_by(desc('age'))  # 降序  需要匯入 from sqlalchemy import desc
    print(list(users))

    # 邏輯運算 and_ , or_ , not_
    users = User.query.filter(User.age>20, User.age<30) # 且運算
    users = User.query.filter(and_(User.age>20, User.age<30))
    users = User.query.filter(or_(User.age>20, User.age<30))
    users = User.query.filter(not_(User.age>20))
    print(list(users))

    # 查詢屬性
    users = User.query.filter(User.name.contains('張'))  # 模糊查詢 類似 like
    # in_() : 查詢屬性
    users = User.query.filter(User.name.in_(['張三', '李四']))  # 查詢在列表中的資料
    # startswith(): 查詢以什麼開頭的資料
    users = User.query.filter(User.name.startswith('張'))
    # endswith(): 查詢以什麼結尾的資料
    users = User.query.filter(User.name.endswith('三'))

    # __gt__: 大於
    # __lt__: 小於
    # __ge__: 大於等於
    # __le__: 小於等於
    users = User.query.filter(User.age.__gt__(20))
    users = User.query.filter(User.age.__ge__(20))
    users = User.query.filter(User.age.__le__(20))
    print(list(users))
    
    return '查詢成功'

相關文章