Python - SQLAlchemy之連表操作

來源:互聯網
上載者:User

標籤:

ORM的兩種建立方式

資料庫優先:指的是先建立資料庫,包括表和欄位的建立,然後根據資料庫產生ORM的代碼,它是先建立資料庫,再建立相關程式碼

代碼優先:就是先寫代碼,然後根據代碼去產生資料庫結構。

代碼優先建立資料庫的本質:拿到類-->轉換成table對象, 然後根據table對象產生sql語句--> 產生資料庫表結構

另外兩個知識點:

  • 改變資料輸出的方式:可以在表的類中定義一個特殊成員:__repr__,return一個自訂的由字串拼接的資料連線方式.
  • 資料庫中表關係之間除了MySQL中標準的外鍵(ForeignKey)之外,還可以建立一個虛擬關係,比如group = relationship("Group",backref=‘uuu‘),一般此虛擬關係與foreignkey一起使用.
SQLalchemy聯表操作1.一對多關聯性

需求:

  1. 使用者組,有dba,ddd組
  2. 使用者,使用者只能屬於一個使用者組

兩個表如下:

group表:

user表:

建立上述兩個表:

#!/usr/bin/env python# -*- coding: utf-8 -*-# auth : pangguopingfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Indexfrom sqlalchemy.orm import sessionmaker, relationshipfrom sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:[email protected]:3306/s13", max_overflow=5)Base = declarative_base()#建立一對多表class Group(Base):    __tablename__ = ‘group‘    nid = Column(Integer,primary_key=True,autoincrement=True)    caption = Column(String(32))class User(Base):    __tablename__ = ‘user‘    nid = Column(Integer,primary_key=True,autoincrement=True)    username = Column(String(32))    group_id = Column(Integer,ForeignKey(‘group.nid‘))    group = relationship("Group",backref=‘uuu‘)    #這個方法輸出什麼,對象就擷取什麼    def __repr__(self):        temp = ‘%s - %s:%s‘ %(self.nid,self.username,self.group_id)        return tempdef init_db():    Base.metadata.create_all(engine)init_db()
View Code

向上述兩個表中添加資料

Session = sessionmaker(bind=engine)session = Session()#向group表中添加資料session.add(Group(caption=‘dba‘))session.add(Group(caption=‘sa‘))session.commit()#向user表中添加資料session.add_all([    User(username=‘user1‘,group_id=1),    User(username=‘user2‘,group_id=1),    User(username=‘user3‘, group_id=2),    User(username=‘user4‘, group_id=2)])session.commit()
View Code

查詢user表中的所有使用者:

# #以left.join查看ret = session.query(User).join(Group,isouter=True).all()print(ret)sql = session.query(User).join(Group,isouter=True)print(sql)
View Code

out:

[1 - user1:1, 2 - user2:1, 3 - user3:2, 4 - user4:2]
SELECT "user".nid AS user_nid, "user".username AS user_username, "user".group_id AS user_group_id
FROM "user" LEFT OUTER JOIN "group" ON "group".nid = "user".group_id

查詢每個使用者對應的組:

常規查詢方式:

# #映射方式sql = session.query(User.username,Group.caption).join(Group,isouter=True)print(sql)ret = session.query(User.username,Group.caption).join(Group,isouter=True).all()print(ret)
View Code

out:

SELECT "user".username AS user_username, "group".caption AS group_caption
FROM "user" LEFT OUTER JOIN "group" ON "group".nid = "user".group_id
[(‘user1‘, ‘dba‘), (‘user2‘, ‘dba‘), (‘user3‘, ‘sa‘), (‘user4‘, ‘sa‘)]

 

Python - SQLAlchemy之連表操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.