校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Flask使用SQLAlchemy實現持久化數據

Flask使用SQLAlchemy實現持久化數據

熱門標簽:銀川電話機器人電話 上海正規的外呼系統最新報價 外賣地址有什么地圖標注 如何地圖標注公司 煙臺電話外呼營銷系統 企業彩鈴地圖標注 預覽式外呼系統 電銷機器人錄音要學習什么 長春極信防封電銷卡批發

項目引入flask-sqlalchemy

首先,安裝flask-sqlalchemy擴展:

$pip install flask-sqlalchemy

然后,在項目中導入SQLAlchemy類,并實例化應用程序使用的數據庫(以mysql為例):

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://account:password@hostname/database'
db = SQLAlchemy(app)

db對象是SQLAlchemy類的實例,表示程序使用的數據庫,同時還獲得了Flask-SQLAlchemy提供的所有功能。

ORM簡介及模型定義

在Python中,可以使用數據庫相應的包直接操作數據庫,如PyMySQL操作MySQL數據庫,還有一些數據庫抽象層代碼包供選擇,如這里要討論的SQLAlchemy。該抽象包直接處理高等級的Python對象,而不用處理如表這樣的數據庫實體。
抽象層,就是所謂的對象關系映射(ORM),其最大的優勢就是:能在用戶不知覺的情況下把高層的面向對象操作轉換成低層的數據庫指令,極大簡化代碼編寫。SQLAlchemy就是已與Flask很好集成的更高層抽象例子,其還支持多種關系型數據庫引擎。

基于SQLAlchemy的模型定義:

class Roles(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('Users', backref='role')

class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

__tablename__定義在數據庫中使用的表名;

db.Column類構造函數的第1個參數是數據庫表列(也是模型屬性)的類型,其余的參數指定屬性(數據庫表列)的配置選項。

2.1 常用的SQLAlchemy列類型

類型名 Python類型 說明
Integer int 普通整數,一般32位
SmallInteger int 取值范圍小的整數,一般16位
BigInteger int或long 不限制精度的整數
Float float 浮點數
String str 變長字符串
Boolean bool 布爾值
Date datetime.date 日期
Time datetime.time 時間
DateTime datetime.datetime 日期和時間
Text str 變長字符串,對較長或不限長度的字符串做了優化
Numeric decimal.Decimal 定點小數

2.2 常用的SQLAlchemy列選項

選項名 說明
primary_key 如果設為True,這列就是表的主鍵
unique 如果設為True,這列不允許重復值
index 如果設為True,為該列創建索引,提升查詢效率
nullable 如果設為True,這列允許null值,如果設為false,不允許為空
default 為這列定義默認值

表關系類型及編碼實現

關系型數據庫使用關系把不同表中的行聯系起來。以上述模型定義代碼為例,假設角色對用戶是一對多的關系(即1個角色可屬于多個用戶,而每個用戶只能有1個角色)。

一對多關系(多對一關系)

在“多”的一方,使用外鍵定義關系
如在Users模型中,定義role_id列為外鍵,給db.Column構造函數傳遞db.ForeignKey()參數,并將roles.id作為db.ForeignKey()的參數,其表明role_id列的值是roles表中行的id值。
在“一”的一方,基于面向對象的視角創建代表實例(記錄或行)的屬性,如上述的users = db.relationship(‘Users', backref=‘role')
db.relationship()的第1個參數表明這個關系的另一端是哪個模型,backref參數向Users模型添加一個role屬性,從而定義反向關系。通過這一屬性(role)可以替代role_id訪問Roles模型,此時將獲取的是模型對象,而不是外鍵的值。
如何理解上述這段話,可以從下面2句代碼加深:

 users = inst_role.users
 user_role = user.role

通過第1句代碼,可以直接獲得特定角色實例(inst_role)相對應的所有users對象,且是以列表形式返回。
通過第2句代碼,可以通過user實例直接獲得該user所對應的role對象(1行記錄,而不是Users模式定義的role_id字段值)。

一對一關系

要定義一對一的關系,只需基于一對多的模型定義基礎上,給db.relationship()函數多傳一個關鍵字表示關系選項:
users = db.relationship(‘Users', backref=‘role', userlist=False)
一對多與一對一在編碼時,有個點需特別注意:當通過“一”的實例(db.relationship定義方)獲取多的一方的對象時:

  • 一對多:users = inst_role.users返回的是對象列表
  • 一對一:users = inst_role.users返回的就是對象,而非列表

多對多關系

Pending…

數據庫基本操作

在Flask-SQLAlchemy中,對數據庫所做的改動均是通過數據庫“會話”進行管理的,會話用db.session表示。如需用db.session.commit()提交對記錄的修改,始終把數據庫相關改動放在會話中提交,可避免因部分更新異常導致數據庫中數據的不一致性。

插入

    admin_role = Roles(name='Admin')
    mod_role = Roles(name='Moderator')
    john = Users(username='liyu', role=admin_role)
    david = Users(username='liji', role=admin_role)
    db.session.add(admin_role)
    db.session.add(mod_role)
    db.session.add(john)
    db.session.add(david)
    db.session.commit()

前4行代碼,實例化2種角色及2個用戶對象(映射至數據庫即是給記錄的字段賦值)
5~7行代碼就是將新增角色及用戶操作放在了1個session中,最后再統一提交(commit),可防止因其中某條語句異常而更新部分從而導致數據的不一致性。該操作就是將多個原子操作組成一個事務,如果某條更新失敗就會導致整個會話失效。
5~7行還可簡寫成: db.session.add([admin_role, mod_role, john, david])

更新

在Flask-SQLAlchemy中,一條記錄表示為一個對象;記錄的字段表示為對象的屬性,因此要更新字段值,實際上就是對對象的屬性賦值:

admin_role.name = 'Administrator'
db.session.add(admin_role)
db.session.commit()

查詢

查詢表中所有記錄:模式.query.all()

eg. Roles.query.all()

使用過濾器進行更精確查詢

過濾器 說明
filter 把過濾器添加到原查詢上
filter_by 把等值過濾器添加到原查詢上
limit 使用指定的值限制原查詢返回的結果數量
offset 偏移原查詢返回的結果
order_by 根據指定條件對原查詢結果進行排序
group_by 根據指定條件對原查詢結果進行分組

2.1 filter與filter_by區別

2.1.1 語法區別

filter需要用“類名.屬性名”且需用==比較,而filter_by直接用屬性名,比較用=

users = Users.query.filter(Users.id == 1).all()
users =  Users.query.filter_by(id = 1).all()

2.1.2 組合查詢

filter不支持組合查詢,只能連續用filter來實現,而filter_by支持組合查詢(下面2條語句效果一樣)

users = Users.query.filter(Users.id == 1).filter(Users.username == 'xxx').all()
users =  Users.query.filter_by(id = 1, username='xxx').all()
# filter_by也支持連續使用

注:如果要查看SQLAlchemy為查詢生成的原生SQL查詢語句,只需把query對象轉換成字符串: str(Users.query.filter_by(role=admin_role))

刪除

執行查詢

在查詢上應用指定的過濾器后,通過調用all()觸發執行查詢,常見的觸發執行方法有: 

方法 說明
all() 查詢所有結果
first() 返回查詢的第1個結果,沒有返回None
get() 返回指定主鍵對應的行,沒有返回None
count() 返回查詢結果的數量
first_or_404() 返回查詢的第1個結果,如果沒有結果,則終止請求,返回404錯誤響應
get_or_404() 返回指定主鍵對應的行,如果沒找到指定的主鍵,則終止請求,返回404錯誤響應
paginate() 返回一個paginate對象

4.1 一對多

4.1.1 從“一”獲取對應的所有多端對象

users = inst_role.users //直接通過角色對象的users屬性獲取所有屬于該角色的用戶對象
role = inst_user.role  //直接通過用戶實例的role屬性獲取該用戶所屬的角色對象,注意這里獲取的是角色對象,而不僅是角色ID

注:inst_role.users獲取對象時,隱含了調用all()方法觸發執行,但如果像加一些過濾器(如排序),則需要在db.relationship中添加lazy='dynamic'關鍵字參數。然后即可引入過濾器:inst_role.users.order_by(Users.username)

4.2 多對多

Pending…

在Flask-SQLAlchemy中,刪除數據庫記錄,可映射至刪除代表該記錄的對象:

db.session.delete(mod_role)
db.session.commit()

參考資料

到此這篇關于Flask使用SQLAlchemy實現持久化數據的文章就介紹到這了,更多相關Flask SQLAlchemy持久化數據內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Flask中sqlalchemy模塊的實例用法
  • flask的orm框架SQLAlchemy查詢實現解析
  • Python使用Flask-SQLAlchemy連接數據庫操作示例
  • Python利用flask sqlalchemy實現分頁效果
  • Python的Flask框架中使用Flask-SQLAlchemy管理數據庫的教程
  • 在Python程序和Flask框架中使用SQLAlchemy的教程
  • Python的Flask框架中SQLAlchemy使用時的亂碼問題解決
  • 在Python的Flask框架下使用sqlalchemy庫的簡單教程
  • Flask SQLAlchemy一對一,一對多的使用方法實踐
  • flask中使用SQLAlchemy進行輔助開發的代碼

標簽:上饒 潮州 宜昌 盤錦 西寧 珠海 佳木斯 湖北

巨人網絡通訊聲明:本文標題《Flask使用SQLAlchemy實現持久化數據》,本文關鍵詞  Flask,使用,SQLAlchemy,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Flask使用SQLAlchemy實現持久化數據》相關的同類信息!
  • 本頁收集關于Flask使用SQLAlchemy實現持久化數據的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产成人免费高清| 欧美不卡一二三| 亚洲人被黑人高潮完整版| 激情国产一区二区| 日韩一级二级三级精品视频| 亚洲国产wwwccc36天堂| 在线观看91精品国产入口| 日本亚洲最大的色成网站www| 69久久99精品久久久久婷婷 | 蜜桃视频一区二区三区| 色婷婷国产精品| 亚洲成人三级小说| 欧美无乱码久久久免费午夜一区| 亚洲激情自拍偷拍| 欧美色区777第一页| 日韩电影一区二区三区| 91精品国产综合久久蜜臀| 国产一区 二区 三区一级| 欧美美女一区二区在线观看| 日韩av中文字幕一区二区| 日韩美女一区二区三区| 国产白丝网站精品污在线入口| 国产精品三级视频| 欧美吞精做爰啪啪高潮| 日韩高清一区在线| www.综合网.com| 久久久综合激的五月天| 亚洲伊人色欲综合网| 成人福利视频在线看| 精品理论电影在线| 国产白丝网站精品污在线入口| 一区二区不卡在线播放| 日韩一区二区三区电影在线观看| 国产传媒久久文化传媒| 亚洲精品国产a久久久久久| 91麻豆精品国产91久久久久久 | 国产精品视频麻豆| 欧美日免费三级在线| 美脚の诱脚舐め脚责91| 亚洲国产另类精品专区| 国产婷婷色一区二区三区| 在线观看日韩精品| 丁香六月综合激情| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲最大色网站| 国产精品亚洲专一区二区三区| 亚洲一级二级三级| 1区2区3区国产精品| 国产精品免费视频一区| 久久久99久久| 国产欧美日韩另类一区| 久久久久久**毛片大全| 精品黑人一区二区三区久久| 在线不卡a资源高清| 欧美性感一类影片在线播放| 91色porny在线视频| 国产伦精品一区二区三区免费迷| 亚洲国产视频网站| 亚洲丰满少妇videoshd| 亚洲一区二区三区四区不卡| 亚洲午夜国产一区99re久久| 亚洲一区二区三区中文字幕| 亚洲制服丝袜av| 日韩精品色哟哟| 国产乱色国产精品免费视频| 成人毛片视频在线观看| 成人在线综合网站| 色8久久精品久久久久久蜜| 欧美三级韩国三级日本三斤| 日韩一区二区视频| 久久久91精品国产一区二区三区| 亚洲国产精品激情在线观看| 欧美一区二区三区色| 色88888久久久久久影院按摩| 精品一区二区三区在线观看| 亚洲精品国久久99热| 中国av一区二区三区| 欧美一区二区免费观在线| 国精产品一区一区三区mba桃花| 久久精品一区四区| 欧美日韩国产精选| 欧美日韩精品一区二区三区蜜桃| 成人午夜又粗又硬又大| 国内精品久久久久影院一蜜桃| 香蕉久久一区二区不卡无毒影院 | 丝瓜av网站精品一区二区| 亚洲乱码国产乱码精品精可以看 | 韩国一区二区三区| 黄色精品一二区| 国产成人综合在线观看| 懂色av一区二区三区免费看| 国产91精品露脸国语对白| 狠狠色丁香婷婷综合久久片| 国产一区二区三区在线观看免费| 久久99国产乱子伦精品免费| 国产麻豆成人精品| 97久久超碰国产精品| 欧美三区在线观看| 欧美怡红院视频| 欧美日韩一区二区电影| 91精品国产综合久久国产大片 | 婷婷六月综合亚洲| 韩国成人精品a∨在线观看| eeuss鲁片一区二区三区在线看| 一本一道综合狠狠老| 91精品国产一区二区三区蜜臀| 精品卡一卡二卡三卡四在线| 国产精品久久久久aaaa樱花| 亚洲国产精品一区二区久久恐怖片| 免费国产亚洲视频| 91免费在线播放| 久久免费视频色| 亚洲精品视频在线观看免费| 日韩av一区二区在线影视| 成人理论电影网| 精品国产一区二区亚洲人成毛片 | 欧美精品18+| 在线成人av影院| 国产精品久线在线观看| 日韩成人av影视| 欧美这里有精品| 日韩伦理免费电影| 精品在线你懂的| 日韩欧美亚洲国产另类| 午夜国产精品一区| 欧美日韩国产高清一区二区 | 国产精品一卡二卡在线观看| 91.com视频| 麻豆91免费看| 制服丝袜中文字幕一区| 天堂久久久久va久久久久| 欧美日韩一级黄| 视频精品一区二区| 欧美日韩国产一区二区三区地区| 亚洲色图视频网站| 在线看一区二区| 日韩精品一级中文字幕精品视频免费观看| 色综合久久中文字幕综合网| 一区二区三区小说| 91麻豆精品国产无毒不卡在线观看| 国产性天天综合网| 不卡一区中文字幕| 亚洲女人****多毛耸耸8| 欧美视频一区二区三区四区| 毛片av一区二区三区| 日韩欧美高清在线| 9l国产精品久久久久麻豆| 一区二区三区高清不卡| 日韩一区二区免费高清| 国产成人午夜高潮毛片| 亚洲高清中文字幕| 久久久久久久综合日本| 欧美在线观看你懂的| 国产一区二区在线观看视频| 亚洲欧洲av色图| 精品国产sm最大网站| 色视频一区二区| 国产成人av资源| 琪琪久久久久日韩精品| 亚洲人妖av一区二区| 精品久久久久久久久久久久包黑料| 成人综合日日夜夜| 五月天中文字幕一区二区| 亚洲国产精品99久久久久久久久| 7777精品伊人久久久大香线蕉的| 国产伦精品一区二区三区视频青涩| 欧美a一区二区| 亚洲青青青在线视频| 日韩欧美一区二区视频| 欧美视频在线一区二区三区| 94色蜜桃网一区二区三区| 国产精品自拍一区| 韩国成人精品a∨在线观看| 日韩电影在线免费观看| 无码av中文一区二区三区桃花岛| 国产精品国模大尺度视频| 亚洲国产精品激情在线观看| 久久精品亚洲国产奇米99| 26uuu精品一区二区在线观看| 日韩欧美123| 国产香蕉久久精品综合网| 国产视频一区二区在线观看| 久久九九影视网| 国产精品国产三级国产普通话三级| 欧美激情一区不卡| 国产精品网站在线| 亚洲精品高清视频在线观看| 亚洲国产乱码最新视频 | 欧美日韩国产一区| 日韩一级片网址| 亚洲成av人片在线观看无码| 国产主播一区二区| 六月丁香婷婷久久| 成人精品视频网站| 欧美性生活大片视频| 久久老女人爱爱| 国产精品毛片高清在线完整版| 亚洲日穴在线视频| 蜜臀av性久久久久蜜臀aⅴ| 国产精品88av|