sqlalchem表關聯(一對多,一對一,多對多)


簡介:

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
View Code

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',)
View Code

 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
View Code

3.實驗:

主表或擴展表,都可以進行單選,選擇另一個表的內容,但是和前面介紹的一樣,最后一次操作,覆蓋前期數據。

4.暫時真不知道怎么用,也不會實現垂直分表。繼續查資料把。

四:

五:

六:

七:

八:

九:

十:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM