Flask-SQLAlchemy 일대다 & 다대다 조회---ORM(2)

26217 단어 파이썬 고급

문서 목록

  • 1.일대다 쿼리
  • (1).배경 지식
  • (2).코드
  • (3).세부 분석
  • 2.멀티 쿼리
  • (1).배경 지식
  • (2).코드
  • (3).세부 분석
  • 1. 일대다 조회


    (1).배경 지식


    classes 표
    classID
    className
    location
    leader
    remark
    21
    즐거운 꽃반
    101
    소명
    22
    행복 아기 반
    102
    번화하다
    23
    국제 베이비반
    102
    jack
    24
    예술취미반
    103
    tony
    students 테이블
    st_id
    name
    gender
    age
    cls_id
    remark
    10001
    소명
    1
    18
    21
    샤오밍은 귀여운 아이이다
    10002
    소홍
    0
    18
    22
    빨강이는 똑똑한 아이예요.
    10003
    큰 소
    1
    19
    21
    큰 소는 용감한 아이이다
    10004
    번화하다
    0
    17
    22
    꽃은 철이 든 아이이다
    10005
    tony
    1
    20
    23
    미국
    10006
    고천악
    1
    22
    21
    검은 말 탄 왕자
    10007
    진도명
    1
    23
    22
    모든 우유를 트렌트라고 부르는 것은 아니다

    (2).코드

    # db_module  
    from APP import db
    
    
    class Classes(db.Model):
        __tablename__ = "classes"
        classID = db.Column(db.INT, primary_key=True, autoincrement=True)
        className = db.Column(db.Text)
        location = db.Column(db.Text)
        leader = db.Column(db.Text)
        remark = db.Column(db.Text)
        #     Classes  Students       ,           db.ForeignKey     
        class_relate_student = db.relationship("Students", backref='student_relate_class', lazy='dynamic')
    
    
    class Students(db.Model):
        __tablename__ = "students"
        st_id = db.Column(db.INT, primary_key=True, autoincrement=True)
        name = db.Column(db.Text)
        gender = db.Column(db.Text)
        age = db.Column(db.INT)
        remark = db.Column(db.Text)
        #   classID       classes     ,    :   +    (  )
        cls_id = db.Column(db.Integer, db.ForeignKey("classes.classID"))
    
    
    key = "  "
    stu = Students.query.filter_by(name=key).first()
    clsName = stu.student_relate_class.className				# stu.student_relate_class      classes  
    print(clsName)
        
    

    (3).구체적 분석


    class_relate_students와 Classes의 관계
  • 첫 번째 매개변수: 참조에 대한 클래스 이름인 "Students"
  • 두 번째 매개 변수:backref는 클래스 Students에 새로운 속성을 설명합니다(이 속성은 두 표 사이에서 서로 가리키기 편리합니다)
  • 세 번째 매개 변수: 레이지는 언제 SQLALchemy가 데이터베이스에서 데이터를 불러올지 결정한다
  • lazy에 대한 용법:
  • select: 속성에 접근할 때 이 속성의 데이터를 모두 불러옵니다.다른 표로 이동해서 여러 쪽이 있으면 지향 속성을 직접 사용하면 됩니다. 원(), all() 등 함수
  • 를 사용할 필요가 없습니다.
  • joined: 관련된 두 테이블에 대한 연결 사용
  • subquery:joined와 유사하지만 하위 검색
  • 을 사용합니다
  • dynamic:query 대상 목록을 생성하고 다른 표로 이동합니다. 대응하는 쪽이 많으면 원(), all(), 퍼스트() 등 방법으로 이 대상을 가져와야 대응하는 속성 값을 얻을 수 있습니다.다른 표로 이동, 적은 쪽이 대응하는 경우 순환 후 속성을 직접 사용하면 속성 값을 획득할 수 있음
  • lazy에 대한 자세한 설명은 다음을 참조하십시오.https://blog.csdn.net/bestallen/article/details/52601457 https://blog.csdn.net/jiulixiang_88/article/details/80587071

    2. 멀티 쿼리


    (1).배경 지식


    customer 테이블
    id
    name
    work
    1
    청 사장
    회사 명
    2
    이 사장
    과학기술을 크게 발전시키다.
    3
    사마 사장
    회사 명
    제품 테이블
    id
    name
    price
    1
    실크
    35
    2
    알루미늄 합금
    54
    3
    소금.
    3
    association 테이블
    id
    customer_id
    product_id
    1
    1
    1
    2
    1
    2
    3
    1
    3
    4
    2
    2
    5
    3
    2
    6
    3
    3

    (2).코드


    다대다의 관계에서 어떻게 어떤 제품명에 따라 어떤 사람이 이 제품을 구매했는지 조회할 수 있습니까?
    
    from flask_sqlalchemy import SQLAlchemy
    from APP.app import app
    
    db = SQLAlchemy(app)
    
    association_table = db.Table('association',
                                 db.Column('id', db.Integer, primary_key=True, autoincrement=True),
                                 db.Column('customer_id', db.Integer, db.ForeignKey('customer.id')),
                                 db.Column('product_id', db.Integer, db.ForeignKey('product.id'))
                                 )
    
    
    class Customer(db.Model):
        __tablename__ = 'customer'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(10))
        work = db.Column(db.String(20))
    
        def __repr__(self):
            return 'name:{name} work:{work}'.format(name=self.name, work=self.work)
    
        customer_to_product = db.relationship('Product',
                                              secondary=association_table,
                                              backref='product_to_customer',
                                              lazy='dynamic'
                                              )
    
    
    class Product(db.Model):
        __tablename__ = 'product'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(10))
        price = db.Column(db.Float)
    
        def __repr__(self):
            return 'name:{name} price:{price}'.format(name=self.name, price=self.price)
    
    
    key = ' '
    pro = Product.query.filter_by(name=key).first()
    print(pro, type(pro))
    c = pro.product_to_customer
    print(c, type(c))
    
    for i in c:
        print(i.name, i.work)
    
    

    최종 출력:
    name:  price:3.0 <class '__main__.Product'>
    [name:    work:      , name:     work:        ] <class 'sqlalchemy.orm.collections.InstrumentedList'>
              
                 
    
    

    같은 이치로 어떤 사람의 정보를 조회함으로써 이 사람이 어떤 제품을 구매했는지 찾을 수 있습니까?
    
    key = '    '
    ct = Customer.query.filter_by(name=key).first()
    print(ct, type(ct))
    
    p = ct.customer_to_product
    print(p, type(p))
    
    for i in p:
        print(i.name, i.price)
    
    
  • 최종 결과:
  • 
    name:     work:         <class '__main__.Customer'>
    SELECT product.id AS product_id, product.name AS product_name, product.price AS product_price 
    FROM product, association 
    WHERE %(param_1)s = association.customer_id AND product.id = association.product_id <class 'sqlalchemy.orm.dynamic.AppenderBaseQuery'>
        54.0
      3.0
    
    

    (3).구체적 분석

  • 먼저 association표의 작성문을 보십시오.
  • 
    CREATE TABLE `association` (
      `id` int(2) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `customer_id` int(2) NOT NULL COMMENT '   ',
      `product_id` int(2) NOT NULL COMMENT '    ',
      PRIMARY KEY (`id`,`customer_id`,`product_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
    
    
  • 위 표와 같이 세 필드는 모두 메인 키입니다.
  • 사실 id 필드는 필요하지 않아도 되지만 다른 두 필드를 메인 키로 해야 합니다.두 개의 메인 키를 통해 두 장의 표를 쉽게 연결하는 것이 목적이다.
  • 그리고 이 두 개의 키도 각각 다른 두 장의 표의 키이다.
  • 그 다음에 association표의 모델 유형을 분석한다.
  • 
    association_table = db.Table('association',
                                 db.Column('id', db.Integer, primary_key=True, autoincrement=True),
                                 db.Column('customer_id', db.Integer, db.ForeignKey('customer.id')),
                                 db.Column('product_id', db.Integer, db.ForeignKey('product.id'))
                                 )
    
    
  • 위의 데이터베이스 모델 클래스는 다른 두 가지 특별한 점보다 association 표를 토대로 두 필드의 키를 다시 정의하고 필드의 이름을 다시 정의했다.
  • flask_sqlalchemy는 오래된 표 association을 새로운 association으로 정의합니다테이블 사용
  • customer 정의id의 필드, 외부 키customer에서 유래한 필드입니다.id(표명+필드)
  • 제품 정의id의 필드, 외부 키 제품에서 유래한 필드입니다.id(표명+필드)
  • 그리고customer표와product표 간의 관계를 분석
  • customer_to_product = db.relationship('Product',
                                          secondary=association_table,
                                          backref='product_to_customer',
                                          lazy='dynamic'
                                            )
    
  • 이 두 표의 메인 키는 이미 association을 통과했다테이블 연결.
  • db.relationship 이 방법은 주로 두 표와 관련된 대상 간의 관계
  • backref라는 파라미터를 사용하면 가상의 지향 관계로 한 대상에서 다른 대상을 가리키는 중간 중추로 이해할 수 있다.
  • 첫 번째 매개 변수: 현재 클래스가 연결해야 하는 ---새 클래스 이름
  • 두 번째 매개 변수:secondary, 이것은 다시 정의된 연관표
  • 세 번째 매개 변수: 새로운 클래스가 현재 클래스를 가리키는 중간 중추명
  • lazy: 이것은 표를 불러오는 방식
  • 참고 사항:https://www.jianshu.com/p/92890a4ec0cb https://www.cnblogs.com/chichung/p/9794850.html

    좋은 웹페이지 즐겨찾기