python|sqlalchemy|聯表查詢


2020-04-20|待完善,給出可以直接運行的py文件

建立表的類

class Account(db.Model):
    __tablename__ = 'account'
    id = db.Column(db.INT, primary_key=True, nullable=False, autoincrement=True)
    nickname = db.Column(db.VARCHAR(64), nullable=False, unique=True)
    def __repr__(self):
        return '' % (self.gameuid)

class Bind(db.Model):
    __tablename__ = 'bind'
    id = db.Column(db.BIGINT, primary_key=True, autoincrement=True)
    # 綁定者和被綁定者的 gameuid; 建立了外鍵關聯; 記錄兩個用戶之間的關系; 再不添加外鍵,也實現聯表查詢(已經確認)
    fromid = db.Column(db.BIGINT, db.ForeignKey('account.id'), nullable=False)
    toid = db.Column(db.BIGINT, db.ForeignKey('account.id'), nullable=False)
    def __repr__(self):
        return '' % (self.fromid, self.toid)

聯表查詢: 基礎

# 查詢id=1000的賬號下綁定的所有賬號
# first: 不使用join
res = db.session.query(Bind.id, Account.id).filter(Bind.fromid == Account.id)filter(Bind.id==1000).all()

# 查看對應的sql語句的方法: print( db.session.query(Bind.id, Account.id).filter(Bind.fromid = Account.id))
# 此時使用的是where語句

# second:使用join
db.session.query(Bind.id, Account.nickname).join(Account, Account.id==Bind.fromid).filter(Bind.toid==1000).all()
# ps: join語句中的表名稱,必須是在query中后出現的表的名稱,否則會報錯;query中的表的順序決定了鏈接表的順序
# ps: 鏈接超過兩張表,可以在join得到的結果后面繼續使用join,也可以在filter后面繼續使用join;無限鏈接下去。

聯表查詢: 篩選特定字段

res = Account.query.join(Bind, Bind.fromid == Account.gameuid). \
    filter(Bind.toid == 1000). \
    with_entities(Bind.bindid, Account.nickname).all()

# 返回的結果: 不是python的truple;實際上是<class 'sqlalchemy.util._collections.result'>,它是 AbstractKeyedTuple 對象,擁有一個 keys() 方法,可以轉化為字典
[(2, '玩家10001'), (3, '玩家10002')]

[dict(zip(item.keys(), item)) for item in res]
# 結果
[{'bindid': 2, 'nickname': '玩家10001'}, {'bindid': 3, 'nickname': '玩家10002'}]

實戰案例

# 表 ClueInfo, ClueTypeInfo, BelongsToRelation
# 還使用到子查詢; in_ or_ and_ ,子查詢不能使用first,all等獲取結果
# filter_by()只允許輸入一個參數;當使用or_ and_ 時候,需要使用filter from sqlalchemy.testing import in_, and_ space_list = db.session.query(ClueInfo, ClueTypeInfo).join(ClueTypeInfo, ClueTypeInfo.id == ClueInfo.clueObjectTypeId) \ .filter(or_(ClueTypeInfo.typeTitle == 'project_space', ClueTypeInfo.typeTitle == 'private_space')) \ .filter(ClueInfo.id.in_(db.session.query(BelongsToRelation.objectId) \ .filter(BelongsToRelation.belongsToClueId == user.id) \ .filter( or_(BelongsToRelation.objectTypeId == 'edeb2efc8a4cc60abe50fe5c42f940da', BelongsToRelation.objectTypeId == 'ff7dc456c24a3662a55b23f36166e71e')) \ .filter(BelongsToRelation.softDeleted == 0))).all()
# 返回的結果是列表

[(<ClueInfo benny>, <ClueTypeInfo project_space>), (<ClueInfo 大市場一樓>, <ClueTypeInfo project_space>)]

 

 

 

 

參考文章鏈接:

https://pdf-lib.org/Home/Details/7409


免責聲明!

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



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