Flask-SQLAlchemy 일대다 & 다대다 조회---ORM(2)
26217 단어 파이썬 고급
문서 목록
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의 관계
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).구체적 분석
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;
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'))
)
customer_to_product = db.relationship('Product',
secondary=association_table,
backref='product_to_customer',
lazy='dynamic'
)