標籤:
ORM的兩種建立方式
資料庫優先:指的是先建立資料庫,包括表和欄位的建立,然後根據資料庫產生ORM的代碼,它是先建立資料庫,再建立相關程式碼
代碼優先:就是先寫代碼,然後根據代碼去產生資料庫結構。
代碼優先建立資料庫的本質:拿到類-->轉換成table對象, 然後根據table對象產生sql語句--> 產生資料庫表結構
另外兩個知識點:
- 改變資料輸出的方式:可以在表的類中定義一個特殊成員:__repr__,return一個自訂的由字串拼接的資料連線方式.
- 資料庫中表關係之間除了MySQL中標準的外鍵(ForeignKey)之外,還可以建立一個虛擬關係,比如
group = relationship("Group",backref=‘uuu‘),一般此虛擬關係與foreignkey一起使用.
SQLalchemy聯表操作1.一對多關聯性
需求:
- 使用者組,有dba,ddd組
- 使用者,使用者只能屬於一個使用者組
兩個表如下:
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之連表操作