SQLAlchemy建立資料庫模型之間的關係

2022-03-02 21:58:14 字數 4042 閱讀 4522

## 一對多關係,單作者-多文章,外來鍵不可少

## 外來鍵(foreignkey)總在多的那邊定義,關係(relationship)總在單的那邊定義

class author(db.model):

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

name = db.column(db.string(70), unique=true)

phone = db.column(db.string(20))

# articles為關係屬性(乙個集合,可以像列表一樣操作,在關係的出發側定義

## relationship()函式的第乙個引數為關係另一側的模型名稱(article)

articles = db.relationship('article')

class article(db.model):

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

title = db.column(db.string(15), index=true)

body = db.column(db.text)

# 傳入foreignkey的引數形式為:"表名.欄位名"

## 模型類對應的表名由flask-sqlalchemy生成,預設為類名稱的小寫形式,多個單詞通過下劃線分隔

author_id = db.column(db.integer, db.foreignkey('author.id')) #

# 外來鍵字段(author_id)和關係屬性(articles)的命名沒有限制

## 建立關係可通過操作關係屬性進行

>>>shansan = author(name="shansan")

>>>hello = article(title="hello world !")

>>>boy = article(title="hello boy !")

>>>db.session.add(shansan) # 將建立的資料庫記錄新增到會話中

>>>db.session.add(hello)

>>>db.session.add(boy)

>>>db.session.commit()

在這裡我們希望可以在book類中存在這樣乙個屬性:通過呼叫它可以獲取對應的作者的記錄,這類返回單個值的關係屬性稱為標量關係屬性

# 建立雙向關係時,關係兩邊都有關係函式

# 在關係函式中,我們使用back_populates引數連線對方,引數的值設定為關係另一側的關係屬性名

class writer(db.model):

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

name = db.column(db.string(64), unique=true)

# back_populates的引數值為關係另一側的關係屬性名

books = db.relationship('book', back_populates='writer')

def __repr__(self):

return '' % self.name

class book(db.model):

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

name = db.column(db.string(50), index=true)

writer_id = db.column(db.integer, db.foreignkey('writer.id'))

writer = db.relationship('writer', back_populates='books')

def __repr__(self):

return '' % self.name

# 設定雙向屬性後,我們既可以通過集合屬性操作關係,也可通過標量關係屬性操作關係

# 外來鍵總在多的一側定義

## 多對一關係中,外來鍵和關係屬性都在多的一側定義

## 這裡的關係屬性是標量關係屬性(返回單一資料)

class citizen(db.model):

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

name = db.column(db.string(20), unique=true)

city_id = db.column(db.integer, db.foreignkey('city.id'))

city = db.relationship('city')

class city(db.model):

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

name = db.column(db.string(20), unique=true)

## 一對一關係,將關係函式的uselist引數設為false,使得集合關係屬性無法使用列表語義操作

## 這裡使用的是一對一雙向關係

class country(db.model):

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

name = db.column(db.string(20), unique=true)

capital = db.relationship('capital', uselist=false)

class capital(db.model):

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

name = db.column(db.string(20), unique=true)

country_id= db.column(db.integer, db.foreignkey('country.id'))

country = db.relationship('country')

## 多對多關係,使用關聯表(association table),關聯表由db.table定義

## 關係函式需要設定secondary引數,值為關係表名

sqlalchemy建立資料庫自動對映

coding utf 8 from datetime import datetime from sqlalchemy.ext.automap import automap base from sqlalchemy.orm import sessionmaker from sqlalchemy imp...

SQLAlchemy連線資料庫建立表

連線資料庫,建立表 defcreate all engine create engine mysql pymysql max overflow 0,超過連線池大小外最多建立的連線 pool size 5,連線池大小 pool timeout 30,池中沒有執行緒最多等待的時間,否則報錯 pool r...

SQLALchemy 資料庫遷移

在開發過程中,需要修改資料庫模型,而且還要在修改之後更新資料庫。最直接的方式就是刪除舊表,但這樣會丟失資料。更好的解決辦法是使用資料庫遷移框架,它可以追蹤資料庫模式的變化,然後把變動應用到資料庫中。在flask中可以使用flask migrate擴充套件,來實現資料遷移。並且整合到flask scr...