【Falsk 使用資料庫】---- 資料庫基本操作
【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)
相關文章
- 資料庫基本操作資料庫
- postgresql 資料庫基本操作SQL資料庫
- Laravel 資料庫基本操作Laravel資料庫
- 資料庫的基本操作資料庫
- mysql資料庫基本操作(五)MySql資料庫
- mysql資料庫基本操作(三)MySql資料庫
- mysql資料庫基本操作(四)MySql資料庫
- 02、MySQL—資料庫基本操作MySql資料庫
- mysql資料庫基本操作(六)MySql資料庫
- 資料庫基本操作 術語資料庫
- python+資料庫(三)用python對資料庫基本操作Python資料庫
- MongoDB資料庫的基本操作梳理MongoDB資料庫
- 2.資料庫Mysql--------基本操作資料庫MySql
- Oracle dos連線資料庫基本操作Oracle資料庫
- Python3資料庫操作基本類Python資料庫
- Oracle資料庫-----資料庫的基本概念Oracle資料庫
- 資料庫操作資料庫
- 資料庫操作·資料庫
- 時序資料庫之InfluxDB的基本操作資料庫UX
- 資料庫內功心法:資料庫基本理論資料庫
- MySQL—-MySQL資料庫入門—-第二章 資料庫和表的基本操作MySql資料庫
- 使用SSMS操作AdventureWorks 示例資料庫SSM資料庫
- MySQL 資料庫操作MySql資料庫
- mongodb資料庫操作MongoDB資料庫
- MongoDB 資料庫操作MongoDB資料庫
- laravel 資料庫操作Laravel資料庫
- 值得白嫖的資料庫常用操作語句彙總(資料庫、資料表、資料操作)資料庫
- postgresql 資料庫基本管理SQL資料庫
- MySQL入門系列:資料庫和表的基本操作MySql資料庫
- MySQL資料庫的基本使用簡單易懂MySql資料庫
- Python 操作 SQLite 資料庫PythonSQLite資料庫
- 資料庫操作語句資料庫
- django操作多資料庫Django資料庫
- Mysql資料庫操作命令MySql資料庫
- PHP操作MySQL資料庫PHPMySql資料庫
- Python操作SQLite資料庫PythonSQLite資料庫
- python操作mongodb資料庫PythonMongoDB資料庫
- django多資料庫操作Django資料庫