亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何建立允許不同類型用戶在 SqlAlchemy 中注冊的數據庫關系

如何建立允許不同類型用戶在 SqlAlchemy 中注冊的數據庫關系

萬千封印 2022-07-05 17:06:40
我有不同的用戶,他們將訪問平臺中的不同功能,并擁有與他們相關的不同信息。我根據下圖實現了這些表,其中我有一個包含身份驗證數據的用戶表,我有兩個表,用于兩種用戶類型及其相應的信息。我與“zpeedr <-> user”有一對一的關系,對于“merchant <-> user”也是如此。我將 flask_sqlalchemy 與 postgresql 數據庫一起使用。如果不按預期將其與現有 user.id 關聯,則無法實例化 zpeedr 或商家類型用戶。我的問題是,使用此設置,我可以為 zpeedr 和商家分配相同的 user_id。我如何確保一個 user.id 只能由 zpeedr 用戶或商家用戶關聯?我創建表的簡化代碼是:類用戶(UserMixin,db.Model):    '''用戶屬性'''    id = db.Column(db.Integer, primary_key=True)    角色 = db.Column(db.String(10), nullable=False)    名稱 = db.Column(db.String(50), nullable=False)    電子郵件 = db.Column(db.String(50),唯一 = True,可為空 = False)    password_hash = db.Column(db.String(250), nullable=False)    狀態 = db.Column(db.String(15), server_default="Pending")    registration_date = db.Column(db.DateTime, server_default=db.func.current_timestamp())    zpeedr = db.relationship('Zpeedr', backref='user', uselist=False)    商家 = db.relationship('Merchant', backref='user', uselist=False)def __init__(self, role, name, email, password_hash, status, registration_date, zpeedr, merchant):    self.role = role    self.name = name    self.email = email    self.password_hash = password_hash    self.status = status    self.registration_date = registration_date    self.zpeedr = zpeedr    self.merchant = merchantZpeedr 類(db.Model):    ''' Zpeedr 屬性 '''    id = db.Column(db.Integer, primary_key=True)    # 用戶表的外鍵    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False, unique=True)    地址 = db.Column(db.String(200), nullable=False)    位置 = db.Column(db.String(50), nullable=False)    郵政編碼 = db.Column(db.String(10), nullable=False)    聯系人 = db.Column(db.String(15), nullable=False)    增值稅 = db.Column(db.String(20), nullable=False, unique=True)    nin = db.Column(db.String(20), nullable=False, unique=True)def __init__(self, user_id, address, location, zipcode, contact, vat, nin):    self.user_id = user_id    self.address = address    self.location = location    self.zipcode = zipcode    self.contact = contact    self.vat = vat    self.nin = nin
查看完整描述

1 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

如果表用戶的目的只是存儲公共數據,您可以使用 postgres繼承。


在一個非常簡化的模型中,您可以擁有:包含所有常見數據的父表


create table user_(

  type varchar(1)

  );

和你的孩子:


 create table zeepdr(

   id integer primary key,

   nin varchar

   ) inherits(user_);


 create table merchant(

   id integer primary key,

   ticker char(4)

  ) inherits(user_);

SQLAlchemy 中對應的代碼應該是這樣的:


Table("zeepdr", metadata, ..., postgresql_inherits="user_")

基本用法


插入


根據我對山羊的看法,您不需要既不是商人也不是 zeepdr 的用戶,因此您將插入數據,就好像父表不存在一樣:


insert into zeepdr(id, type, nin) values(1,'Z','a');

insert into merchant(id, type, ticker) values(1,'M','aaaa');

這也意味著用戶將是商人或 zeepdr。


選擇


select * from zeepdr;

行為如你所料。此外,如果您只想從所有用戶那里檢索公共數據,您可以使用關鍵字ONLY:


select * from ONLY user_;

或在 SQLAlchemy


result = table.select().with_hint(table, 'ONLY', 'postgresql')

更多信息:約束


除非您使用NO INHERIT. 其他類型沒有繼承。


最后一點


有關繼承和 SQLAlchemy 的更多信息here


查看完整回答
反對 回復 2022-07-05
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號