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