python SQLAchemy外鍵關聯

join

一、利用filter
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

from sqlalchemy.orm import sessionmaker
from sqlalchemy import func
# 鏈接方式 mysql+pymysql 用戶名 root 密碼 123456 主機 localhost 庫 testdb encoding 字符集
engine = create_engine("mysql+pymysql://root:123456@localhost/testdb",encoding='utf-8', echo=True)

Base = declarative_base()  # 生成orm基類

class User(Base):
    __tablename__ = 'user'  # 表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    password = Column(String(64))

    def __repr__(self):
        return "<%s name:%s>" % (self.id,self.name)

class Student(Base):
    __tablename__ = 'student'  # 表名
    id = Column(Integer,primary_key=True)
    name = Column(String(32),nullable=False)
    register_data = Column(DATE,nullable=False)
    gender=Column(String(32),nullable=False)

    def __repr__(self):
        return "<%s name:%s>" % (self.id,self.name)

Base.metadata.create_all(engine)  # 建立表結構


Session_class = sessionmaker(bind=engine)  # 建立與數據庫的會話session class ,注意,這裏返回給session的是個class,不是實例
Session = Session_class()  # 生成session實例 cursor
print(Session.query(User,Student).filter(User.id==Student.id).all())

 2 、joinpython

這個要求A表和B表必須有FOREIGN KEY的關係才能夠。mysql

Session.query(User).join(Student).all()
Session.query(User).join(Student,isouter=True).all()

 ORM實現外鍵約束

用戶表、課程表、用戶與課程中間表sql

一、首先把用戶和用戶中間表管理起來
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String,ForeignKey,DATE
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func
# 鏈接方式 mysql+pymysql 用戶名 root 密碼 123456 主機 localhost 庫 testdb encoding 字符集
engine = create_engine("mysql+pymysql://root:@localhost/test",encoding='utf-8', echo=True)

Base = declarative_base()  # 生成orm基類

class Student(Base):
    __tablename__='student'
    id = Column(Integer,primary_key=True)
    name=Column(String(32),nullable=False)
    register_date=Column(DATE,nullable=False)

    def __repr__(self):
        return "<%s name:%s>" % (self.id,self.name)

class StudyRecord(Base):
    __tablename__='study_record'
    id = Column(Integer,primary_key=True)
    day = Column(Integer,nullable=False)
    status = Column(String(32),nullable=False)
    stu_id = Column(Integer,ForeignKey('student.id'))

    def __repr__(self):
        return "<%s name:%s>" % (self.id,self.day)

Base.metadata.create_all(engine)  # 建立表結構

 以上先建立兩張表數據庫

二、添加學員
Session_class = sessionmaker(bind=engine)
Session = Session_class()  # 生成session實例 cursor

s1 = Student(name='Alex',register_date='2017-10-24')
s2 = Student(name='jack',register_date='2017-10-24')
s3 = Student(name='rain',register_date='2017-10-24')
s4 = Student(name='Lily',register_date='2017-10-24')
s5 = Student(name='Lucy',register_date='2017-10-24')

study_obj1 = StudyRecord(day=1,status='yes',stu_id=1)
study_obj2 = StudyRecord(day=2,status='yes',stu_id=1)
study_obj3 = StudyRecord(day=3,status='yes',stu_id=1)
study_obj4 = StudyRecord(day=1,status='yes',stu_id=2)
study_obj5 = StudyRecord(day=2,status='yes',stu_id=2)

Session.add_all([s1,s2,s3,s4,s5,study_obj1,study_obj2,study_obj3,study_obj4,study_obj5])


Session.commit()  # 現此才統一提交,建立數據
三、 查詢

先看一個比較牛的東西:反查。經過設置的一個字段反向查詢關聯的表。關聯表也能夠根據這個字段查詢當前表。雙向反查。session

class StudyRecord(Base):
    __tablename__='study_record'
    id = Column(Integer,primary_key=True)
    day = Column(Integer,nullable=False)
    status = Column(String(32),nullable=False)
    stu_id = Column(Integer,ForeignKey('student.id'))
    student = relationship('Student',backref='my_classes') #指定關聯的表 Student, backref
    def __repr__(self):
        return "<%s day:%s status:%s>" % (self.student.name,self.day,self.status)

Base.metadata.create_all(engine)  # 建立表結構

Session_class = sessionmaker(bind=engine)
Session = Session_class() # 生成session實例 cursor

Stu_obj = Session.query(Student).filter(Student.name=='alex').first()
print(Stu_obj.my_classes)

 

首先 stu_id爲ForeignKey,relationship()函數將告知ORM經過StudyRecord.student 關聯到類Student。relationship()會使用兩個表的外鍵約束來斷定這種連接的性質。backref提供一種反向的查詢。Student經過 Student.my_classes反向查詢到StudyRecord。 函數

相關文章
相關標籤/搜索