Skip to content

Commit 375b190

Browse files
Add example using new Synchronous API.
1 parent 067301b commit 375b190

File tree

3 files changed

+62
-69
lines changed

3 files changed

+62
-69
lines changed

example_sync/example/example.py

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
from uuid import uuid4, UUID
77
from typing import Any, List
88

9-
from db_wrapper import ConnectionParameters, SyncClient, Model
9+
from db_wrapper import SyncClient, ConnectionParameters
10+
from db_wrapper.model import SyncModel as Model
1011

1112
from models import (
1213
AModel,
13-
# ExtendedModel,
14-
# ExtendedModelData,
14+
ExtendedModel,
15+
ExtendedModelData,
1516
)
1617

1718
logging.basicConfig(level=logging.INFO)
@@ -39,7 +40,7 @@ def default(self, obj: Any) -> Any:
3940
client = SyncClient(conn_params)
4041

4142
a_model = Model[AModel](client, 'a_model')
42-
# extended_model = ExtendedModel(client)
43+
extended_model = ExtendedModel(client)
4344

4445

4546
def create_a_model_record() -> UUID:
@@ -67,50 +68,49 @@ def read_a_model(id_value: UUID) -> AModel:
6768
return a_model.read.one_by_id(str(id_value))
6869

6970

70-
# def create_extended_models() -> None:
71-
# """Show how using an extended Model can be the same as the defaults."""
72-
# dicts = [{
73-
# 'id': uuid4(),
74-
# 'string': 'something',
75-
# 'integer': 1,
76-
# 'data': {'a': 1, 'b': 2, 'c': True}
77-
# }, {
78-
# 'id': uuid4(),
79-
# 'string': 'something',
80-
# 'integer': 1,
81-
# 'data': {'a': 1, 'b': 2, 'c': True}
82-
# }, {
83-
# 'id': uuid4(),
84-
# 'string': 'something',
85-
# 'integer': 1,
86-
# 'data': {'a': 1, 'b': 2, 'c': True}
87-
# }, {
88-
# 'id': uuid4(),
89-
# 'string': 'something',
90-
# 'integer': 1,
91-
# 'data': {'a': 1, 'b': 2, 'c': True}
92-
# }]
93-
#
94-
# new_records: List[ExtendedModelData] = [
95-
# ExtendedModelData(**record) for record in dicts]
96-
#
97-
# # by looping over a list of records, you can use the default create.one
98-
# # method to create each record as a separate transaction
99-
# for record in new_records:
100-
# extended_model.create.one(record)
101-
#
102-
#
103-
# def read_extended_models() -> List[ExtendedModelData]:
104-
# """Show how to use an extended Model's new methods."""
105-
# # We defined read.all in ./models/extended_model.py's ExtendedRead class,
106-
# # then replaced ExtendedModel's read property with ExtendedRead.
107-
# # As a result, we can call it just like any other method on Model.read.
108-
# return extended_model.read.all()
71+
def create_extended_models() -> None:
72+
"""Show how using an extended Model can be the same as the defaults."""
73+
dicts = [{
74+
'id': uuid4(),
75+
'string': 'something',
76+
'integer': 1,
77+
'data': {'a': 1, 'b': 2, 'c': True}
78+
}, {
79+
'id': uuid4(),
80+
'string': 'something',
81+
'integer': 1,
82+
'data': {'a': 1, 'b': 2, 'c': True}
83+
}, {
84+
'id': uuid4(),
85+
'string': 'something',
86+
'integer': 1,
87+
'data': {'a': 1, 'b': 2, 'c': True}
88+
}, {
89+
'id': uuid4(),
90+
'string': 'something',
91+
'integer': 1,
92+
'data': {'a': 1, 'b': 2, 'c': True}
93+
}]
94+
95+
new_records: List[ExtendedModelData] = [
96+
ExtendedModelData(**record) for record in dicts]
97+
98+
# by looping over a list of records, you can use the default create.one
99+
# method to create each record as a separate transaction
100+
for record in new_records:
101+
extended_model.create.one(record)
102+
103+
104+
def read_extended_models() -> List[ExtendedModelData]:
105+
"""Show how to use an extended Model's new methods."""
106+
# We defined read.all in ./models/extended_model.py's ExtendedRead class,
107+
# then replaced ExtendedModel's read property with ExtendedRead.
108+
# As a result, we can call it just like any other method on Model.read.
109+
return extended_model.read.all()
109110

110111

111112
def run() -> None:
112113
"""Show how to make a connection, execute queries, & disconnect."""
113-
114114
# First, have the client make a connection to the database
115115
client.connect()
116116

@@ -121,8 +121,8 @@ def run() -> None:
121121
try:
122122
new_id = create_a_model_record()
123123
created_a_model = read_a_model(new_id)
124-
# create_extended_models()
125-
# extended_models = read_extended_models()
124+
create_extended_models()
125+
extended_models = read_extended_models()
126126
finally:
127127
client.disconnect()
128128

example_sync/example/models/a_model.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
class AModel(ModelData):
99
"""An example Item."""
1010

11-
# PENDS python 3.9 support in pylint,
12-
# ModelData inherits from TypedDict
13-
# pylint: disable=too-few-public-methods
14-
1511
string: str
1612
integer: int
1713
array: List[str]

example_sync/example/models/extended_model.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""An example implementation of custom object Model."""
1+
"""An example implementation of custom object SyncModel."""
22

33
import json
44
from typing import Any, List, Dict
@@ -7,7 +7,8 @@
77
from psycopg2.extensions import register_adapter
88
from psycopg2.extras import Json
99

10-
from db_wrapper.model import ModelData, Model, Read, Create, Client
10+
from db_wrapper import SyncClient
11+
from db_wrapper.model import ModelData, SyncModel, SyncRead, SyncCreate
1112

1213
# tell psycopg2 to adapt all dictionaries to json instead of
1314
# the default hstore
@@ -17,22 +18,18 @@
1718
class ExtendedModelData(ModelData):
1819
"""An example Item."""
1920

20-
# PENDS python 3.9 support in pylint,
21-
# ModelData inherits from TypedDict
22-
# pylint: disable=too-few-public-methods
23-
2421
string: str
2522
integer: int
2623
data: Dict[str, Any]
2724

2825

29-
class ExtendedCreator(Create[ExtendedModelData]):
30-
"""Add custom json loading to Model.create."""
26+
class ExtendedCreator(SyncCreate[ExtendedModelData]):
27+
"""Add custom json loading to SyncModel.create."""
3128

3229
# pylint: disable=too-few-public-methods
3330

34-
async def one(self, item: ExtendedModelData) -> ExtendedModelData:
35-
"""Override default Model.create.one method."""
31+
def one(self, item: ExtendedModelData) -> ExtendedModelData:
32+
"""Override default SyncModel.create.one method."""
3633
columns: List[sql.Identifier] = []
3734
values: List[sql.Literal] = []
3835

@@ -55,15 +52,15 @@ async def one(self, item: ExtendedModelData) -> ExtendedModelData:
5552
)
5653

5754
result: List[ExtendedModelData] = \
58-
await self._client.execute_and_return(query)
55+
self._client.execute_and_return(query)
5956

6057
return result[0]
6158

6259

63-
class ExtendedReader(Read[ExtendedModelData]):
60+
class ExtendedReader(SyncRead[ExtendedModelData]):
6461
"""Add custom method to Model.read."""
6562

66-
async def all_by_string(self, string: str) -> List[ExtendedModelData]:
63+
def all_by_string(self, string: str) -> List[ExtendedModelData]:
6764
"""Read all rows with matching `string` value."""
6865
query = sql.SQL(
6966
'SELECT * '
@@ -74,29 +71,29 @@ async def all_by_string(self, string: str) -> List[ExtendedModelData]:
7471
string=sql.Identifier(string)
7572
)
7673

77-
result: List[ExtendedModelData] = await self \
74+
result: List[ExtendedModelData] = self \
7875
._client.execute_and_return(query)
7976

8077
return result
8178

82-
async def all(self) -> List[ExtendedModelData]:
79+
def all(self) -> List[ExtendedModelData]:
8380
"""Read all rows."""
8481
query = sql.SQL('SELECT * FROM {table}').format(
8582
table=self._table)
8683

87-
result: List[ExtendedModelData] = await self \
84+
result: List[ExtendedModelData] = self \
8885
._client.execute_and_return(query)
8986

9087
return result
9188

9289

93-
class ExtendedModel(Model[ExtendedModelData]):
94-
"""Build an ExampleItem Model instance."""
90+
class ExtendedModel(SyncModel[ExtendedModelData]):
91+
"""Build an ExampleItem SyncModel instance."""
9592

9693
read: ExtendedReader
9794
create: ExtendedCreator
9895

99-
def __init__(self, client: Client) -> None:
96+
def __init__(self, client: SyncClient) -> None:
10097
super().__init__(client, 'extended_model')
10198
self.read = ExtendedReader(self.client, self.table)
10299
self.create = ExtendedCreator(self.client, self.table)

0 commit comments

Comments
 (0)