from sqlalchemy importcolumn, 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
的對映:
classaddress(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.user
和user.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 ...