-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathh_views.py
More file actions
101 lines (85 loc) · 2.56 KB
/
h_views.py
File metadata and controls
101 lines (85 loc) · 2.56 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
"""
Objective: understand how to create a MaterializedView / View in SQLA.
Adapted from the `tests <https://github.com/kvesteri/sqlalchemy-utils/
blob/master/tests/test_views.py>`_ in sqlalchemy-utils.
"""
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy_utils import (
create_materialized_view,
create_view,
refresh_materialized_view
)
engine = create_engine('postgresql://test:test@localhost/test', echo=True)
Session = sessionmaker(bind=engine)
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String)
class Article(Base):
__tablename__ = 'article'
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String)
author_id = sa.Column(sa.Integer, sa.ForeignKey(User.id))
author = sa.orm.relationship(User)
class ArticleMV(Base):
__table__ = create_materialized_view(
name='article_mv',
selectable=sa.select(
[
Article.id,
Article.name,
User.id.label('author_id'),
User.name.label('author_name')
],
from_obj=(
Article.__table__
.join(User, Article.author_id == User.id)
)
),
metadata=Base.metadata,
indexes=[sa.Index('article_mv_id_idx', 'id')]
)
class ArticleView(Base):
__table__ = create_view(
name='article_view',
selectable=sa.select(
[
Article.id,
Article.name,
User.id.label('author_id'),
User.name.label('author_name')
],
from_obj=(
Article.__table__
.join(User, Article.author_id == User.id)
)
),
metadata=Base.metadata
)
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
# Test
session = Session()
article = Article(
name='Some article',
author=User(name='Some user')
)
session.add(article)
session.commit()
refresh_materialized_view(session, 'article_mv')
materialized = session.query(ArticleMV).first()
assert materialized.name == 'Some article'
assert materialized.author_name == 'Some user'
article = Article(
name='Some article',
author=User(name='Some user')
)
session.add(article)
session.commit()
row = session.query(ArticleView).first()
assert row.name == 'Some article'
assert row.author_name == 'Some user'