日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flask Web中的db.relationship()

發(fā)布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask Web中的db.relationship() 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉載鏈接來自:

https://www.jianshu.com/p/dbeec464c3ad

本文主要介紹如何使用flask操作數(shù)據(jù)庫。

數(shù)據(jù)庫按照一定規(guī)則保存程序數(shù)據(jù),程序再發(fā)起查詢取回所需的數(shù)據(jù)。Web程序最常用基于關系模型的數(shù)據(jù)庫,這種數(shù)據(jù)庫也稱為SQL數(shù)據(jù),因為它們使用結構化查詢語句。不過最近幾年文檔數(shù)據(jù)庫和鍵值對數(shù)據(jù)庫成了流行的替代選擇,這兩種數(shù)據(jù)庫合稱為NoSQL數(shù)據(jù)庫。

大多數(shù)的數(shù)據(jù)庫引擎都有對應的Python包,包括開源寶和商業(yè)包。Flask并不限制你使用何種類型的數(shù)據(jù)庫包,因此可以根據(jù)自己的喜好選擇使用MySQL、Postgres、SQLite,Redis、MongoDB或者CouchDB。

如果這些都無法滿足需求,還有一些數(shù)據(jù)庫抽象層代碼包供選擇,例如SQLAlchemy和MongoEngine。你可以使用這些抽象包直接處理高等級的Python對象,而不用處理如表、文檔或查詢語言此類的數(shù)據(jù)庫實體。

選擇框架時,你不一定非得選擇已經集成了Flask的框架,但選擇這些框架可以節(jié)約你編寫集成代碼的時間。使用集成了Flask的框架可以簡化配置和操作,所以專門為Flask開發(fā)的擴展是你的首選。

關于選擇使用的數(shù)據(jù)庫框架,選擇的是Flask-SQLAlchemy。

0.安裝Flask-SQLAlchemy

pip install flask-sqlalchemy

1.配置Flask-SQLAlchemy

在Flask-SQLAlchemy中,數(shù)據(jù)庫使用URL指定。

MySQL : mysql://username:password@hostname/database
Postgres : postgresql://username:password@hostname/database
SQLite : sqlite:absolute/path/to/database

在這些URL中,hostname表示MySQL服務所在的主機,可以是本地主機(localhost),也可以是遠程服務器。數(shù)據(jù)庫服務器上可以托管多個數(shù)據(jù)庫,因此database表示要使用的數(shù)據(jù)庫名。如果數(shù)據(jù)庫需要進行認證,username和password表示數(shù)據(jù)庫的用戶名和密碼。

SQLite數(shù)據(jù)庫不需要使用服務器,因此不用指定hostname、username和password。URL中的database是硬盤上文件的文件名。

程序使用的數(shù)據(jù)庫URL必須保存到Flask配置對象的SQLALCHEMY_DATABASE_URI鍵中。配置對象中還有一個很有用的選項,即SQLALCHEMY_ON_REARDOWN鍵,將其設置為True時,每次請求結束后都會自動提交數(shù)據(jù)庫中的變動。

我們使用SQLite數(shù)據(jù)庫,配置代碼 如下:

from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy import osbaseDir = os.path.abspath(os.path.dirname(__file__))app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] =\'sqlite:' + os.path.join(baseDir,'data.sqlite') app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = Truedb = SQLAlchemy(app)

2.定義模型

定義一個用戶表users和一個角色表roles,代碼如下:

class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer,primary_key=True)username = db.Column(db.String(64),unique=True,index=True)def __repr__(self):return '<User %r>' % self.usernameclass Role(db.Model):__tablename__ = 'roles'id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(64),unique=True)def __repr__(self):return '<Role %r>' % self.name

解釋下:

0.兩個類User和Role繼承自db.Model
1.__tablename__用來指定表名稱
2.db.Column函數(shù)指定了數(shù)據(jù)庫中字段的類型,是否是主鍵(primary_key),是否唯一(unique),是否加索引(index),還有其他的比如:是否可以為空(nullable=True),默認值(default)

3.關系

使用關系型數(shù)據(jù)庫,不指定關系怎么能行。定義模型中我們沒有指定關系,一個用戶有一個角色,一個角色可以屬于多個用戶,典型的一對多的關系,如何在Flask-SQLAlchemy中定義關系?

上代碼:

class User(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'))def __repr__(self):return '<User %r>' % self.usernameclass Role(db.Model):__tablename__ = 'roles'id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(64),unique=True)users = db.relationship('User',backref='role')def __repr__(self):return '<Role %r>' % self.name

添加了兩行代碼:

第一行,User類中:

role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))

這句話比較好理解,和上面普通變量差不多,就是User類中添加了一個role_id變量,數(shù)據(jù)類型db.Integer,第二個參數(shù)指定外鍵是哪個表中哪個id。

第二行,Role類中:

users = db.Relationship('User',backref='role')

這句話比較復雜,仔細讀下面的話:

0.添加到Role模型中的users屬性代表這個關系的面向對象視角。對于一個Role類的實例,其users屬性將返回與角色相關聯(lián)的用戶組成的列表。
1.db.Relationship()第一個參數(shù)表明這個關系的另一端是哪個模型(類)。如果模型類尚未定義,可使用字符串形式指定。
2.db.Relationship()第二個參數(shù)backref,將向User類中添加一個role屬性,從而定義反向關系。這一屬性可替代role_id訪問Role模型,此時獲取的是模型對象,而不是外鍵的值。

上面的關系為一對多關系的表示,一對一怎么辦?
調用db.Relationship()時需要把userlist參數(shù)設置為False。如下:

db.Relationship('User',backref='role',uselist=False)

至于多對多關系,以后會慢慢介紹。

4.數(shù)據(jù)庫操作

數(shù)據(jù)庫操作,基本的一些:數(shù)據(jù)庫、表創(chuàng)建或刪除,數(shù)據(jù)的增刪改查。

0.創(chuàng)建數(shù)據(jù)庫和表

db.create_all()

上面說的users表和roles表就創(chuàng)建了。

1.刪除數(shù)據(jù)庫

db.drop_all()

1.插入行

role_admin = Role(name='Admin') user_tom = User(username='tom',role=role_admin) user_jim = User(username='jim',role=role_admin) user_tim = User(username='tim',role=role_admin) user_sam = User(username='sam',role=role_admin) db.session.add(role_admin) db.session.add(user_tom) db.session.add(user_jim) db.session.commit()

通過數(shù)據(jù)庫會話管理對數(shù)據(jù)庫所做的改動,在Flask-SQLAlchemy中,會話由db.session表示,準備把隊形寫入數(shù)據(jù)庫之前,先要將其添加到會話中。寫入數(shù)據(jù)庫需要調用db.session.commit()方法。

2.修改行

我們將role_admin變量中name為Admin改成Administrator。

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

3.刪除行

刪除Jim用戶

db.session.delete(user_jim) db.session.commit()

4.查詢行

查詢所有用戶

User.query.all() #返回結果:[<User 'tom'>, <User 'tim'>, <User 'sam'>]

更多相關方面文檔請參考:SQLAlchemy文檔



作者:iYiming
鏈接:https://www.jianshu.com/p/dbeec464c3ad
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。

總結

以上是生活随笔為你收集整理的Flask Web中的db.relationship()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。