Skip to content

Commit 417d4cc

Browse files
committed
Enahncement: API
1 parent 67f4f49 commit 417d4cc

File tree

3 files changed

+13
-34
lines changed

3 files changed

+13
-34
lines changed

tests/test_extension.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,32 +37,28 @@ class Foo(Base):
3737

3838
@app.route()
3939
@json
40-
@app.db
4140
def get(req):
4241
with app.db.session() as session:
4342
result = session.scalars(select(Foo)).all()
4443
return {f.id: f.title for f in result}
4544

4645
@app.route()
4746
@json
48-
@app.db
4947
def got(req):
50-
Foo(title='foo')
48+
with app.db.session.begin():
49+
app.db.session.add(Foo(title='foo'))
5150
raise statuses.created()
5251

5352
@app.route()
5453
@json
55-
@app.db
5654
def err(req):
57-
Foo(title='qux')
55+
with app.db.session() as session:
56+
session.add(Foo(title='qux'))
5857
raise statuses.badrequest()
5958

6059
def getfoo(title):
6160
with app.db.session() as session:
62-
result = session.scalars(
63-
select(Foo).where(Foo.title == title)
64-
).first()
65-
return result
61+
return session.query(Foo).filter_by(title=title).first()
6662

6763
with Given():
6864
assert status == 200

yhttp/ext/sqlalchemy/install.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ def ready(app):
2020
def shutdown(app):
2121
app.db.disconnect()
2222

23+
@app.when
24+
def endresponse(response):
25+
app.db.session.reset()
26+
2327
app.db = db

yhttp/ext/sqlalchemy/orm.py

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
1-
import functools
2-
31
from sqlalchemy import create_engine
42
from sqlalchemy.orm import sessionmaker, close_all_sessions, Session, \
53
scoped_session
6-
from yhttp.core import HTTPStatus
74

85

96
class ORM:
107
def __init__(self, basemodel, url=None):
118
self.url = url
129
self.engine = None
1310
self.basemodel = basemodel
14-
self._session = scoped_session(sessionmaker())
15-
16-
def session(self):
17-
return self._session()
11+
self.session = scoped_session(sessionmaker())
1812

1913
def copy(self, url=None):
2014
return ORM(self.basemodel, url=url or self.app.settings.db.url)
@@ -28,12 +22,12 @@ def connect(self, url=None):
2822
assert u is not None
2923

3024
self.engine = create_engine(u, isolation_level='REPEATABLE READ')
31-
self._session.configure(bind=self.engine)
25+
self.session.configure(bind=self.engine)
3226

3327
def disconnect(self):
3428
close_all_sessions()
35-
self._session.expunge_all()
36-
self._session.remove()
29+
self.session.expunge_all()
30+
self.session.remove()
3731
self.engine.dispose()
3832
self.engine = None
3933

@@ -58,18 +52,3 @@ def connect(self, url=None):
5852
)
5953

6054
return super().connect(url=url or self.app.settings.db.url)
61-
62-
def __call__(self, handler):
63-
@functools.wraps(handler)
64-
def outter(*a, **kw):
65-
try:
66-
return handler(*a, **kw)
67-
except HTTPStatus as ex:
68-
if ex.keepheaders:
69-
return ex
70-
71-
raise
72-
finally:
73-
self._session.reset()
74-
75-
return outter

0 commit comments

Comments
 (0)