婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > Flask使用SQLAlchemy實(shí)現(xiàn)持久化數(shù)據(jù)

Flask使用SQLAlchemy實(shí)現(xiàn)持久化數(shù)據(jù)

熱門標(biāo)簽:銀川電話機(jī)器人電話 上海正規(guī)的外呼系統(tǒng)最新報(bào)價(jià) 外賣地址有什么地圖標(biāo)注 如何地圖標(biāo)注公司 煙臺(tái)電話外呼營銷系統(tǒng) 企業(yè)彩鈴地圖標(biāo)注 預(yù)覽式外呼系統(tǒng) 電銷機(jī)器人錄音要學(xué)習(xí)什么 長(zhǎng)春極信防封電銷卡批發(fā)

項(xiàng)目引入flask-sqlalchemy

首先,安裝flask-sqlalchemy擴(kuò)展:

$pip install flask-sqlalchemy

然后,在項(xiàng)目中導(dǎo)入SQLAlchemy類,并實(shí)例化應(yīng)用程序使用的數(shù)據(jù)庫(以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對(duì)象是SQLAlchemy類的實(shí)例,表示程序使用的數(shù)據(jù)庫,同時(shí)還獲得了Flask-SQLAlchemy提供的所有功能。

ORM簡(jiǎn)介及模型定義

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

基于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__定義在數(shù)據(jù)庫中使用的表名;

db.Column類構(gòu)造函數(shù)的第1個(gè)參數(shù)是數(shù)據(jù)庫表列(也是模型屬性)的類型,其余的參數(shù)指定屬性(數(shù)據(jù)庫表列)的配置選項(xiàng)。

2.1 常用的SQLAlchemy列類型

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

2.2 常用的SQLAlchemy列選項(xiàng)

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

表關(guān)系類型及編碼實(shí)現(xiàn)

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

一對(duì)多關(guān)系(多對(duì)一關(guān)系)

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

 users = inst_role.users
 user_role = user.role

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

一對(duì)一關(guān)系

要定義一對(duì)一的關(guān)系,只需基于一對(duì)多的模型定義基礎(chǔ)上,給db.relationship()函數(shù)多傳一個(gè)關(guān)鍵字表示關(guān)系選項(xiàng):
users = db.relationship(‘Users', backref=‘role', userlist=False)
一對(duì)多與一對(duì)一在編碼時(shí),有個(gè)點(diǎn)需特別注意:當(dāng)通過“一”的實(shí)例(db.relationship定義方)獲取多的一方的對(duì)象時(shí):

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

多對(duì)多關(guān)系

Pending…

數(shù)據(jù)庫基本操作

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

插入

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

更新

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

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

查詢

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

eg. Roles.query.all()

使用過濾器進(jìn)行更精確查詢

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

2.1 filter與filter_by區(qū)別

2.1.1 語法區(qū)別

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

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

2.1.2 組合查詢

filter不支持組合查詢,只能連續(xù)用filter來實(shí)現(xiàn),而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也支持連續(xù)使用

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

刪除

執(zhí)行查詢

在查詢上應(yīng)用指定的過濾器后,通過調(diào)用all()觸發(fā)執(zhí)行查詢,常見的觸發(fā)執(zhí)行方法有: 

方法 說明
all() 查詢所有結(jié)果
first() 返回查詢的第1個(gè)結(jié)果,沒有返回None
get() 返回指定主鍵對(duì)應(yīng)的行,沒有返回None
count() 返回查詢結(jié)果的數(shù)量
first_or_404() 返回查詢的第1個(gè)結(jié)果,如果沒有結(jié)果,則終止請(qǐng)求,返回404錯(cuò)誤響應(yīng)
get_or_404() 返回指定主鍵對(duì)應(yīng)的行,如果沒找到指定的主鍵,則終止請(qǐng)求,返回404錯(cuò)誤響應(yīng)
paginate() 返回一個(gè)paginate對(duì)象

4.1 一對(duì)多

4.1.1 從“一”獲取對(duì)應(yīng)的所有多端對(duì)象

users = inst_role.users //直接通過角色對(duì)象的users屬性獲取所有屬于該角色的用戶對(duì)象
role = inst_user.role  //直接通過用戶實(shí)例的role屬性獲取該用戶所屬的角色對(duì)象,注意這里獲取的是角色對(duì)象,而不僅是角色I(xiàn)D

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

4.2 多對(duì)多

Pending…

在Flask-SQLAlchemy中,刪除數(shù)據(jù)庫記錄,可映射至刪除代表該記錄的對(duì)象:

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

參考資料

到此這篇關(guān)于Flask使用SQLAlchemy實(shí)現(xiàn)持久化數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Flask SQLAlchemy持久化數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Flask使用SQLAlchemy實(shí)現(xiàn)持久化數(shù)據(jù)》,本文關(guān)鍵詞  Flask,使用,SQLAlchemy,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Flask使用SQLAlchemy實(shí)現(xiàn)持久化數(shù)據(jù)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Flask使用SQLAlchemy實(shí)現(xiàn)持久化數(shù)據(jù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩精品一级中文字幕精品视频免费观看| 欧美艳星brazzers| 久久久国产午夜精品| 国内久久婷婷综合| 国产欧美日韩在线| 成人av电影在线网| 一区二区三区四区高清精品免费观看 | 国产91精品在线观看| 亚洲国产精品v| 91在线观看免费视频| 一区二区三区欧美| 538在线一区二区精品国产| 日韩不卡一区二区| 国产视频一区不卡| 日本精品一区二区三区高清| 视频一区二区中文字幕| 久久久久成人黄色影片| 94色蜜桃网一区二区三区| 亚洲成人综合视频| 久久综合久久综合亚洲| 99久久国产综合精品麻豆| 亚洲第一二三四区| 久久婷婷国产综合精品青草| 99视频精品免费视频| 亚洲v中文字幕| 久久久久久久久久久黄色| 99精品欧美一区| 六月丁香综合在线视频| 国产精品激情偷乱一区二区∴| 欧美亚洲免费在线一区| 韩国av一区二区三区四区| 亚洲免费观看高清完整版在线观看熊| 欧美一三区三区四区免费在线看| 福利91精品一区二区三区| 午夜影视日本亚洲欧洲精品| 久久久精品免费免费| 欧洲另类一二三四区| 国产乱子伦一区二区三区国色天香| 亚洲精品自拍动漫在线| 久久九九全国免费| 4hu四虎永久在线影院成人| 成人免费精品视频| 久久不见久久见免费视频1| 一区二区三区日韩欧美| 中文字幕欧美日本乱码一线二线| 欧美人动与zoxxxx乱| 91丨九色丨尤物| 狠狠色狠狠色综合日日91app| 亚洲曰韩产成在线| 国产精品护士白丝一区av| 欧美精品一区二区不卡| 欧美精品第一页| 在线观看不卡一区| 99久久婷婷国产综合精品电影 | 欧美高清激情brazzers| 色综合天天综合网国产成人综合天| 韩日av一区二区| 青草av.久久免费一区| 夜夜精品视频一区二区| 成人欧美一区二区三区1314| 久久综合久久99| 欧美va亚洲va| 欧美人妇做爰xxxⅹ性高电影| 91婷婷韩国欧美一区二区| 国产99久久久久| 国产乱码精品一区二区三区av| 美女免费视频一区二区| 日韩和欧美一区二区| 午夜av区久久| 日韩精品三区四区| 日韩中文字幕亚洲一区二区va在线| 亚洲日本欧美天堂| ㊣最新国产の精品bt伙计久久| 欧美国产一区在线| 国产精品女上位| 一区二区中文视频| 亚洲欧美视频在线观看视频| 最新热久久免费视频| 亚洲欧美日韩国产中文在线| 亚洲黄色片在线观看| 亚洲一区二区三区三| 亚洲国产一区二区视频| 午夜精品福利一区二区三区av | 久久免费美女视频| 久久久亚洲精品石原莉奈 | 亚洲视频综合在线| 亚洲精品第一国产综合野| 亚洲激情第一区| 亚洲r级在线视频| 日产欧产美韩系列久久99| 经典一区二区三区| 国产69精品久久久久毛片| 成人ar影院免费观看视频| 91网站最新网址| 欧美日韩aaa| 精品国产91久久久久久久妲己 | 亚洲一区二区欧美日韩| 天天色天天操综合| 久久成人免费网站| 99久久精品免费精品国产| 在线视频你懂得一区| 欧美一区二区视频在线观看2020 | 日韩你懂的在线播放| 精品播放一区二区| 亚洲欧洲在线观看av| 亚洲成a人片在线不卡一二三区| 美女mm1313爽爽久久久蜜臀| 国产91精品在线观看| 91久久精品午夜一区二区| 欧美不卡一区二区| 成人免费一区二区三区视频 | 久久久青草青青国产亚洲免观| 国产精品久久久久一区二区三区 | 亚洲免费观看在线视频| 免费在线观看日韩欧美| 91亚洲永久精品| 91精品福利在线一区二区三区| 国产欧美日韩不卡| 天天做天天摸天天爽国产一区 | 一区二区三区精品久久久| 免费观看在线色综合| www.亚洲在线| 欧美成人a视频| 亚洲免费观看在线视频| 韩国v欧美v日本v亚洲v| 欧美在线影院一区二区| 国产午夜一区二区三区| 亚洲成年人影院| av在线不卡免费看| 久久综合九色综合97婷婷女人 | jlzzjlzz国产精品久久| 欧美xxxx老人做受| 亚洲福利视频一区| 99re8在线精品视频免费播放| 精品粉嫩aⅴ一区二区三区四区| 亚洲一区二区视频在线| 不卡av在线网| 久久影院午夜论| 丝袜美腿成人在线| 91网站最新网址| 中文字幕国产一区| 国产在线麻豆精品观看| 91精品啪在线观看国产60岁| 艳妇臀荡乳欲伦亚洲一区| 成人av网站免费| 国产亲近乱来精品视频| 韩国女主播成人在线| 日韩欧美国产麻豆| 视频一区欧美精品| 欧美日韩精品一二三区| 一区二区国产视频| 一本大道久久精品懂色aⅴ| 国产精品动漫网站| 成人丝袜18视频在线观看| 久久久久久久国产精品影院| 九一久久久久久| 日韩午夜小视频| 日韩国产精品久久久| 91精品国模一区二区三区| 亚洲成av人片观看| 欧美精品tushy高清| 午夜精品久久一牛影视| 欧美猛男男办公室激情| 香蕉成人伊视频在线观看| 欧美日韩激情在线| 免费一级片91| 日韩欧美国产wwwww| 六月丁香综合在线视频| 日韩美女天天操| 国产中文字幕一区| 国产精品免费av| 99免费精品视频| 亚洲天堂av一区| 91福利视频久久久久| 亚洲国产欧美在线| 91精品国产一区二区三区香蕉| 美女久久久精品| 亚洲国产精华液网站w| 一本大道综合伊人精品热热| 一区二区成人在线| 日韩三级.com| 国产成人免费视频网站| 国产精品乱码人人做人人爱| 色婷婷av一区二区| 天堂va蜜桃一区二区三区漫画版| 欧美电视剧免费全集观看| 国产99久久久久久免费看农村| 亚洲日本免费电影| 欧美乱妇15p| 国产伦精品一区二区三区免费 | 成人免费观看视频| 一区二区免费在线播放| 91精品国产免费久久综合| 国产一区高清在线| 亚洲视频每日更新| 欧美一二三四区在线| 成人激情开心网| 日韩激情一二三区| 国产精品麻豆欧美日韩ww| 欧美二区三区的天堂|