-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathorm_select.py
More file actions
126 lines (98 loc) · 3.82 KB
/
orm_select.py
File metadata and controls
126 lines (98 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from pprint import pprint
from sqlalchemy import create_engine
from sqlalchemy import select
from sqlalchemy import func
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import joinedload
from sqlalchemy.orm import selectinload
from orm_schema import Ad
from orm_schema import Car
from orm_schema import Seller
engine = create_engine('sqlite:///database2.sqlite', echo=True, future=True)
Session = sessionmaker(engine, future=True)
def example1():
with Session() as session:
result = session.execute(
select(Car)
.where(Car.make == 'Nissan')
)
pprint(result.scalars().all())
def example2():
"""Пример фильтрации по атрибутам связанной сущности, используя join."""
with Session() as session:
result = session.execute(
select(Ad)
.join_from(Ad, Car)
.where(Car.make == 'Nissan')
)
pprint(result.scalars().all())
def example3():
"""Пример фильтрации по атрибутам связанной сущности, используя метод has у relationship."""
with Session() as session:
result = session.execute(
select(Ad)
.where(Ad.car.has(make='Nissan'))
)
pprint(result.scalars().all())
def example4():
"""Пример группировки и использования агрегирующих функций на связанных таблицах через join.
Задача: выбрать продавцов, публиковавших больше одного объявления."""
with Session() as session:
result = session.execute(
select(Seller)
.join_from(Seller, Ad)
.group_by(Seller.id)
.having(func.count(Ad.id) > 1)
)
pprint(result.scalars().all())
def example5():
"""Пример группировки и использования агрегирующих функций на связанных таблицах через подзапрос.
Задача: выбрать продавцов, публиковавших больше одного объявления."""
with Session() as session:
result = session.execute(
select(Seller)
.where(Seller.id.in_(
select(Ad.seller_id)
.group_by(Ad.seller_id)
.having(func.count(Ad.id) > 1)
))
)
pprint(result.scalars().all())
def example6():
"""Пример "жадной" загрузки связанных one to one сущностей через join.
Выгружаем продавцов вместе с их аккаунтами."""
with Session() as session:
result = session.execute(
select(Seller)
.options(joinedload(Seller.account, innerjoin=True))
)
pprint(result.scalars().all())
def example7():
with Session() as session:
result = session.execute(
select(Seller)
)
pprint(result.scalars().all())
def example8():
"""Пример "жадной" загрузки связанных one to many сущностей через select in.
Выгружаем продавцов вместе с их объявлениями."""
with Session() as session:
result = session.execute(
select(Seller)
.options(
joinedload(Seller.account, innerjoin=True),
selectinload(Seller.ads),
)
)
for seller in result.scalars():
pprint(seller)
pprint(seller.ads)
if __name__ == '__main__':
# example1()
# example2()
# example3()
# example4()
# example5()
# example6()
example7()
# example8()