Flask 物件關係

2022-07-25 19:57:16 字數 3958 閱讀 7951

from sqlalchemy import

column, integer, string, metadata, foreignkey

from sqlalchemy.ext.declarative import

declarative_base

from sqlalchemy.orm import

relationship, backref

metadata =metadata()

base = declarative_base(metadata=metadata)

class

user(base):

__tablename__ = '

users

'id = column(integer, primary_key=true)

name =column(string)

password =column(string)

def__repr__

(self):

return

"" % (self.name, self.password)

第二個表address與user關聯,可以被對映和查詢。users 在可以儲存任意數量的電子郵件位址關聯的使用者名稱。這意味著乙個從users到乙個儲存電子郵件位址的新錶addresses一對多關聯。我們在address中使用宣告定義這張表與user的對映: 

class

address(base):

__tablename__ = '

addresses

'id = column(integer, primary_key=true)

email_address = column(string, nullable=false)

#foreignkey函式是乙個應用於column的指令,表明這一列的值應該儲存指定名稱的遠端列的值。

user_id = column(integer, foreignkey('

users.id'))

user = relationship("

user

", backref='

addresses

', lazy='

dynamic')

def__repr__

(self):

return

"" %(self.email_address)

#第乙個引數為對應參照的類user,第二個引數backref表示給關聯的資料庫模型新增乙個屬性

#第三個引數lazy決定了什麼時候sqlalchemy從資料庫中載入資料。

# relationship()的引數中有乙個稱為backref()的relationship()的子函式,反向提供詳細的資訊,

#即在users中新增user對應的address物件的集合,儲存在user.addresses中。

上述類使用了foreignkey函式,它是乙個應用於column的指令,表明這一列的值應該儲存指定名稱的遠端列的值。這是關聯式資料庫的乙個核心特徵,是「膠水」,將原本無關的表變為有豐富的重疊關係的集合。上面的foreignkey表示,addresses.user_id列的值應該等於users.id列中的值,即,users的主鍵。

第二個函式,稱為relationship(), 它告訴 orm ,address類本身應該使用屬性address.user鏈結到user類。relationship()使用兩個表之間的外來鍵關係來確定這個鏈結的性質,這個例子中,確定address.user將要成為多對一中多的一側。relationship()的引數中有乙個稱為backref()relationship()的子函式,反向提供詳細的資訊, 即在users中新增user對應的address物件的集合,儲存在user.addresses中。多對一關係的反向始終是一對多的關係。乙個完整的可用的relationship()配置目錄在基本關係模式。

兩個互補關係,address.useruser.addresses被稱為乙個雙向關係,並且這是sqlalchemy orm的乙個關鍵特性。

#

models.py

class

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

', lazy='

dynamic')

class

user(usermixin, db.model):

__tablename__ = '

users

'id = db.column(db.integer, primary_key=true)

email = db.column(db.string(64), unique=true, index=true)

username = db.column(db.string(64), unique=true, index=true)

password_hash = db.column(db.string(128))

role_id = db.column(db.integer, db.foreignkey('

roles.id

'), nullable=true)

ticketholiday_id = db.relationship('

ticketholiday

', backref='

user

', lazy='

dynamic')

class

ticketholiday(db.model):

__tablename__ = '

ticketholidays

'id = db.column(db.integer, primary_key=true)

type =db.column(db.integer)

about =db.column(db.text)

user_id = db.column(db.integer, db.foreignkey('

users.id

'), nullable=false)

注意你在role資料庫模型中的users,它並不是roles表中的字段,users = db.relationship('user', backref='role', lazy='dynamic'),relationship的第乙個引數表示這個關係的另乙個資料庫模型是哪個,這裡是user,第二個引數backref表示給關聯的資料庫模型新增乙個屬性,這裡是role。

也就是說,你可以通過user模型的role這個屬性去訪問role模型,比如你在views.py中的查詢結果,你可以通過user.role.name得到roles表中對應記錄的name,user.role.id則得到roles表中對應記錄的id

注意名稱的大小寫,一一對應

Flask 模型關係

在models中 建立乙個一的類 建立乙個一的類 class grade db.model id db.column db.integer,primary key true,autoincrement true,name db.column db.string 20 unique true 重點,r...

flask 請求物件

flask通過上下文變數request對外開放請求物件如下表 屬性或方法 說明form 乙個字典,儲存請求提交的所有表單字段 args 乙個字典,儲存通過url查詢字元傳遞的所有引數 values 乙個字典,form和args的集合 cookies 乙個字典,儲存請求的所有cookie header...

Flask 多對多關係

1.專案結構 對錶的基本操作可見鏈結 3.多對多關係 以下通過文章,作者,文章 標記 三個表示例操作 from flask import flask from flask sqlalchemy import sqlalchemy import config create table article ...