?? 歡迎大家來(lái)到景天科技苑??
???? 養(yǎng)成好習(xí)慣,先贊后看哦~????
?? 作者簡(jiǎn)介:景天科技苑
??《頭銜》:大廠(chǎng)架構(gòu)師,華為云開(kāi)發(fā)者社區(qū)專(zhuān)家博主,阿里云開(kāi)發(fā)者社區(qū)專(zhuān)家博主,CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專(zhuān)家等。
??《博客》:Python全棧,前后端開(kāi)發(fā),人工智能,js逆向,App逆向,網(wǎng)絡(luò)系統(tǒng)安全,數(shù)據(jù)分析,Django,fastapi,flask等框架,linux,shell腳本等實(shí)操經(jīng)驗(yàn),網(wǎng)站搭建,面試寶典等分享。所屬的專(zhuān)欄:flask框架零基礎(chǔ),進(jìn)階應(yīng)用實(shí)戰(zhàn)教學(xué)
景天的主頁(yè):景天科技苑
ORM
ORM 全拼Object-Relation Mapping
,中文意為 對(duì)象-關(guān)系映射。主要實(shí)現(xiàn)模型對(duì)象到關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)的映射。
ORM提供了一種面向?qū)ο蟛僮鲾?shù)據(jù)庫(kù)的方式給開(kāi)發(fā)者。不需要編寫(xiě)原生SQL語(yǔ)句也能操作數(shù)據(jù)庫(kù),實(shí)現(xiàn)了業(yè)務(wù)代碼與底層數(shù)據(jù)的解耦。
優(yōu)點(diǎn):
- 只需要面向?qū)ο缶幊? 不需要面向數(shù)據(jù)庫(kù)編寫(xiě)SQL。
- 對(duì)數(shù)據(jù)庫(kù)的操作都轉(zhuǎn)化成對(duì)類(lèi)/對(duì)象的屬性和方法的操作. 表字段—>對(duì)象屬性, SQL關(guān)鍵字-> 操作方法
- 不用編寫(xiě)各種數(shù)據(jù)庫(kù)的
原生sql語(yǔ)句
,當(dāng)然也可以編寫(xiě)原生SQL語(yǔ)句。
- 實(shí)現(xiàn)了數(shù)據(jù)模型代碼與數(shù)據(jù)庫(kù)數(shù)據(jù)的解耦, 屏蔽了不同數(shù)據(jù)庫(kù)操作上的差異。
- 不再需要關(guān)注當(dāng)前項(xiàng)目使用的是哪種數(shù)據(jù)庫(kù)。
- 通過(guò)簡(jiǎn)單的配置就可以輕松更換數(shù)據(jù)庫(kù), 而不需要修改業(yè)務(wù)代碼.
缺點(diǎn):
- 相比較直接使用SQL語(yǔ)句操作數(shù)據(jù)庫(kù),ORM需要把操作轉(zhuǎn)換成SQL語(yǔ)句,所以有性能損失.
- 根據(jù)對(duì)象的操作轉(zhuǎn)換成SQL語(yǔ)句,根據(jù)查詢(xún)的結(jié)果轉(zhuǎn)化成模型實(shí)例對(duì)象, 在映射過(guò)程中有性能損失.
- 不同的ORM提供的操作不一樣,增加了學(xué)習(xí)成本
flask與python原生操作數(shù)據(jù)庫(kù)流程對(duì)比
Flask-SQLAlchemy
flask默認(rèn)不提供數(shù)據(jù)庫(kù)操作,也并沒(méi)有提供ORM,所以一般開(kāi)發(fā)的時(shí)候我們會(huì)采用flask-SQLAlchemy模塊來(lái)實(shí)現(xiàn)ORM操作。
SQLAlchemy是一個(gè)python語(yǔ)言編寫(xiě)的高性能的關(guān)系型數(shù)據(jù)庫(kù)ORM框架,它提供了高層的 ORM 和底層的原生數(shù)據(jù)庫(kù)的操作。
我們使用sqlalchemy 不需要調(diào)用sqlalchemy 本身這個(gè)模塊,而是采用flask-sqlalchemy ,這是一個(gè)簡(jiǎn)化了 SQLAlchemy 操作的flask擴(kuò)展模塊。(主要是簡(jiǎn)化了sqlalchemy初始化代碼和分頁(yè)操作等)
安裝 flask-sqlalchemy
pip install flask-sqlalchemy
如果sqlalchemy連接的是 mysql /MariaDB數(shù)據(jù)庫(kù),需要安裝 mysqldb 或pymysql驅(qū)動(dòng)
pip install pymysql
原生SQLAlchemy連接配置操作
db.py,代碼:
from sqlalchemy import create_engine # 驅(qū)動(dòng)引擎
from sqlalchemy.ext.declarative import declarative_base # 數(shù)據(jù)庫(kù)基類(lèi)
from sqlalchemy import Column, Integer, String, Boolean, Numeric, Text # 字段、整型
from sqlalchemy.orm import sessionmaker # 連接會(huì)話(huà)
#創(chuàng)建數(shù)據(jù)庫(kù)連接引擎
engine = create_engine(
# 連接數(shù)據(jù)庫(kù)的URL,url里面是數(shù)據(jù)庫(kù)類(lèi)型+數(shù)據(jù)庫(kù)驅(qū)動(dòng)
url="mysql+pymysql://root:Jin*******7!@10.10.0.52:3306/students?charset=utf8mb4", # 如果底層驅(qū)動(dòng)是pymysql
# url="mysql://root:123@127.0.0.1:3306/students?charset=utf8mb4", # 如果底層驅(qū)動(dòng)是MysqlDB
echo=True, # 當(dāng)設(shè)置為T(mén)rue時(shí)會(huì)將orm語(yǔ)句轉(zhuǎn)化為sql語(yǔ)句打印,一般debug的時(shí)候可用
pool_size=8, # 連接池的大小,默認(rèn)為5個(gè),設(shè)置為0時(shí)表示連接無(wú)限制
pool_recycle=60*30 # 設(shè)置時(shí)間以限制數(shù)據(jù)庫(kù)多久沒(méi)連接自動(dòng)斷開(kāi),單位是秒
)
#創(chuàng)建會(huì)話(huà)連接
DbSession = sessionmaker(bind=engine)
session = DbSession()
# 創(chuàng)建數(shù)據(jù)基類(lèi)
Model = declarative_base()
manage.py,代碼:
import db
#聲明的數(shù)據(jù)庫(kù)類(lèi)要繼承我們創(chuàng)建的數(shù)據(jù)庫(kù)基類(lèi)
class Student(db.Model):
#聲明表名
__tablename__ = "flask_student"
#設(shè)置表中的字段,字段類(lèi)型,約束等
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
sex = db.Column(db.Boolean)
age = db.Column(db.Integer)
#如果表中有的字段是python中的關(guān)鍵字,則不能直接定義,需要用到別名轉(zhuǎn)換
class_name = db.Column("class", db.String(255),)
description = db.Column(db.Text)
is_delete = db.Column(db.Boolean, nullable=True, default=False)
if __name__ == '__main__':
# 如果沒(méi)有提前聲明模型中的數(shù)據(jù)表,則可以采用以下代碼生成數(shù)據(jù)表,
# 如果數(shù)據(jù)庫(kù)中已經(jīng)聲明了有數(shù)據(jù)表,則不會(huì)繼續(xù)生成
db.Model.metadata.create_all(db.engine)
執(zhí)行,可以看到執(zhí)行的sql語(yǔ)句
查看數(shù)據(jù)庫(kù),有創(chuàng)建我們指定的表
看下表結(jié)構(gòu)
針對(duì)數(shù)據(jù)庫(kù)的增刪改查操作
添加數(shù)據(jù)
# 添加一條數(shù)據(jù)
student = Student(
name="zhangsan",
class_name="301",
sex=True,
age=18,
description="張三愛(ài)發(fā)明",
is_delete = True
)
db.session.add(student)
db.session.commit()
數(shù)據(jù)庫(kù)查看
添加多條數(shù)據(jù)
student_list = [
Student(name="xiaohei", class_name="305", sex=False, age=18, description="美美的..",),
Student(name="xiaobai", class_name="304", sex=True, age=18, description="美美的..",),
Student(name="xiaohui", class_name="303", sex=False, age=18, description="美美的..",),
]
db.session.add_all(student_list)
db.session.commit()
在數(shù)據(jù)庫(kù)中查看
查詢(xún)所有數(shù)據(jù)
data_list = db.session.query(Student).all()
print(data_list)
for data in data_list:
print(data.name)
默認(rèn)我們打印出來(lái)查詢(xún)的是類(lèi)對(duì)象,我們可以在模型類(lèi)中通過(guò)__repr__方法,將類(lèi)對(duì)象轉(zhuǎn)化為我們自定義的格式化字符串
def __repr__(self):
return f"<{self.name} {self.__class__.__name__}>"
根據(jù)ID查詢(xún)一條數(shù)據(jù),query里面的參數(shù)是我們創(chuàng)建的表類(lèi)名,查詢(xún)不到返回為None
ret = db.session.query(Student).get(1)
print(ret)
print(ret.name)
print(ret.class_name)
查詢(xún)不存在的id,返回為None
所以,查詢(xún)之前要做個(gè)判斷
按條件查詢(xún)
data_list = db.session.query(Student).filter(Student.sex==True, Student.class_name=='301').all()
print(data_list)
for data in data_list:
print(data.sex, data.name)
更新一條數(shù)據(jù)
student = db.session.query(Student).get(35)
student.name = "小會(huì)"
db.session.commit()
查看數(shù)據(jù)庫(kù),可見(jiàn)id為3的記錄名字已被修改
更新多條數(shù)據(jù)
db.session.query(Student).filter(Student.class_name=="305").update({Student.age:Student.age+1})
db.session.commit()
先看下更新之前,班級(jí)為305的學(xué)生的年齡都是18歲
執(zhí)行之后
年齡被修改
刪除一條數(shù)據(jù)
student = db.session.query(Student).get(3)
db.session.delete(student)
db.session.commit()
id為3的數(shù)據(jù)被刪除
刪除多條數(shù)據(jù)
db.session.query(Student).filter(Student.class_name == "304").delete()
db.session.commit()
刪除之前,我們先添加些數(shù)據(jù)
執(zhí)行刪除
可見(jiàn)班級(jí)為304的數(shù)據(jù)已被刪除
執(zhí)行原生sql語(yǔ)句
# 原生SQL語(yǔ)句
# 讀
cursor = db.session.execute('select * from flask_student;')
#一條
data = cursor.fetchone()
print(data)
此時(shí),會(huì)報(bào)如下錯(cuò)誤
出錯(cuò)原因:是因?yàn)橐驗(yàn)榘惭b的python包依賴(lài)sqlalchmy版本不一致造成的
我的代碼原來(lái)是這樣的db.session.execute(“select * from flask_student”)把他改成
db.session.execute(text(“select * from flask_student”))這樣,然后記得導(dǎo)入from sqlalchemy.sql import text。就可以了。
最新用法
# 原生SQL語(yǔ)句
from sqlalchemy.sql import text
# 讀
cursor = db.session.execute(text('select * from flask_student'))
#一條
data = cursor.fetchone()
print(data)
#獲取多條
data_list = cursor.fetchall()
print(data_list)
寫(xiě)[添加、刪除、修改]
sql ='insert into flask_student(name, class, age, sex, description,is_delete) values(:name, :class, :age, :sex, :description, :is_delete)'
cursor = db.session.execute(text(sql),
params={
"name": "jintian",
"class": "307",
"age": 19,
"sex": 0,
"description": ".....",
"is_delete":False
})
db.session.commit()
print(cursor.lastrowid) # 獲取最后添加的主鍵ID
數(shù)據(jù)庫(kù)查看
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-854370.html
總結(jié)
本文詳述了python中的SQLAlchemy操作mysql數(shù)據(jù)庫(kù)的詳細(xì)用法,后續(xù)在我們?cè)趂lask中操作數(shù)據(jù)庫(kù)就借助這個(gè)工具,非常實(shí)用,感興趣的朋友可以一鍵三連,flask的高階用法持續(xù)更新中!??!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-854370.html
到了這里,關(guān)于【python】flask操作數(shù)據(jù)庫(kù)工具SQLAlchemy,詳細(xì)用法和應(yīng)用實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!