簡介:
sqlalchemy是我們在python中經常使用的ORM組件,用來把python和數據庫模型連接起來。
讓用的關系型數據庫,ms_sql_server , mysql,mariadb都是關系型數據庫,那么我們一定要處理數據庫之間的關系。
本文將探索使用sqlalchemy對數據庫關系進行定義,並結合flask的開發,明確在flask-admin當中如何快速實現這種關系。
一:多對一
1.很多工人在一個班組,很多人擁有相同的學歷。那么我們就要在工人這個頁面單選所屬班組,學歷等級。
2.模型定義:

class Group(Base): __tablename__ = 'group' id = Column(Integer, primary_key=True) users = relationship("Users", back_populates="group") name = Column(String(32)) def __str__(self): return self.name class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) group_id = Column(Integer, ForeignKey('group.id')) group = relationship("Group", back_populates="users") name = Column(String(32)) def __str__(self): return self.name
3.測試:
在flask-admin當中管理Users表時,可以單選一個班組名稱。
在flask-admin當中管理Group表時,可以多選用戶。但是候選用戶時所有用戶,如果某個用戶已經有一個所屬班組,那么更新操作會覆蓋這個用戶之前的所屬班組。
日常操作,一般時在用戶頁修改所屬班組,極少在班組頁面進行多選添加成員。而數據定義當中的Group.users,是方便進行雙向連接,可以根據班組查詢用戶的。如果沒有其它功能需要讀取這個列表,那么可以取消這個定義。
如果需要這個操作,那么可以考慮在flask-admin中使用自定義視圖的方式,不在創建,編輯表單中顯示這個字段。
class Group_view(ModelView): form_excluded_columns = ('users',)
admin.add_view(ModelView(Users, session, name='用戶')) #系統默認視圖注冊 admin.add_view(Users_view(Users, session, name='用戶')) #使用自定義視圖注冊。
二:多對多
1.每個班組都有工長,副工長。
2.模型定義:

group_duties = Table('group_duties', Base.metadata, Column('group_id', Integer, ForeignKey('group.id')), Column('duties_id', Integer, ForeignKey('duties.id')) ) class Group(Base): __tablename__ = 'group' id = Column(Integer, primary_key=True) name = Column(String(32)) duties = relationship("Duties", secondary=group_duties) def __str__(self): return self.name class Duties(Base): __tablename__ = 'duties' id = Column(Integer, primary_key=True) name = Column(String(32)) group = relationship("Group", secondary=group_duties) def __str__(self): return self.name class Duties_views(ModelView): form_excluded_columns = ('group',)
3.測試
無論是班組表還是職務表,都可以進行多選。而且互相並不影響,但是實際使用中,一般是會對班組進行操作,對班組設置職務,而不是在職務選擇班組,所以像多對一一樣,我在表單隱藏了一項。
4.刪除
當使用多對多關系時,我們同時使用了3張表,flask-admin只管理了兩張表,第三張表作為中間表,當在flask-admin當中刪除任意一項時,會自動處理中間表,刪除中間表和該數據相關的條目。
三:一對一
1.我認為這個一對一是垂直分表來使用的東西。當數據口夠大的時候,垂直分表,甚至分庫,將是有效提升執行效率的辦法。
2.源碼:

class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(32)) ext = relationship("User_ext", uselist=False, back_populates="user") def __str__(self): return self.name class User_ext(Base): __tablename__ = 'user_ext' id = Column(Integer, primary_key=True) name = Column(String(32)) user_id = Column(Integer, ForeignKey('user.id')) user = relationship("User", back_populates="ext") def __str__(self): return self.name
3.實驗:
主表或擴展表,都可以進行單選,選擇另一個表的內容,但是和前面介紹的一樣,最后一次操作,覆蓋前期數據。
4.暫時真不知道怎么用,也不會實現垂直分表。繼續查資料把。