diff --git a/README.md b/README.md index 37c479c..3cc548a 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Overview * Requires Python 3.8+ * Has support for PostgreSQL via [aiopg](https://github.com/aio-libs/aiopg) * Has support for MySQL via [aiomysql](https://github.com/aio-libs/aiomysql) -* Single point for high-level async API +* Asynchronous analogues of peewee sync methods with prefix aio_ * Drop-in replacement for sync code, sync will remain sync * Basic operations are supported * Transactions support is present, yet not heavily tested @@ -53,7 +53,7 @@ import peewee_async # Nothing special, just define model and database: -database = peewee_async.PostgresqlDatabase( +database = peewee_async.PooledPostgresqlDatabase( database='db_name', user='user', host='127.0.0.1', @@ -61,7 +61,7 @@ database = peewee_async.PostgresqlDatabase( password='password', ) -class TestModel(peewee.Model): +class TestModel(peewee_async.AioModel): text = peewee.CharField() class Meta: @@ -73,17 +73,13 @@ TestModel.create_table(True) TestModel.create(text="Yo, I can do it sync!") database.close() -# Create async models manager: - -objects = peewee_async.Manager(database) - # No need for sync anymore! database.set_allow_sync(False) async def handler(): - await objects.create(TestModel, text="Not bad. Watch this, I'm async!") - all_objects = await objects.execute(TestModel.select()) + await TestModel.aio_create(text="Not bad. Watch this, I'm async!") + all_objects = await TestModel.select().aio_execute() for obj in all_objects: print(obj.text) @@ -92,7 +88,7 @@ loop.run_until_complete(handler()) loop.close() # Clean up, can do it sync again: -with objects.allow_sync(): +with database.allow_sync(): TestModel.drop_table(True) # Expected output: diff --git a/examples/aiohttp_example.py b/examples/aiohttp_example.py index 3539e81..db47e9c 100644 --- a/examples/aiohttp_example.py +++ b/examples/aiohttp_example.py @@ -4,8 +4,8 @@ from secrets import token_hex from datetime import datetime from aiohttp import web -from peewee import Model, CharField, TextField, DateTimeField -from peewee_async import PooledPostgresqlDatabase, Manager +from peewee import CharField, TextField, DateTimeField +from peewee_async import PooledPostgresqlDatabase, AioModel logger = logging.getLogger(__name__) @@ -19,14 +19,12 @@ max_connections=10, ) -objects = Manager(database) - app = web.Application() routes = web.RouteTableDef() -class Post(Model): +class Post(AioModel): title = CharField(unique=True) key = CharField(unique=True, default=lambda: token_hex(8)) text = TextField() @@ -48,7 +46,7 @@ def add_post(title, text): async def get_post_endpoint(request): query = dict(request.query) post_id = query.pop('p', 1) - post = await objects.get_or_none(Post, id=post_id) + post = await Post.aio_get_or_none(id=post_id) if post: return web.Response(text=post.text) else: @@ -68,10 +66,10 @@ async def update_post_endpoint(request): except Exception as exc: return web.Response(text=str(exc), status=400) - post = await objects.get_or_none(Post, id=post_id) + post = await Post.aio_get_or_none(id=post_id) if post: post.text = text - await objects.update(post) + await post.aio_save() return web.Response(text=post.text) else: return web.Response(text="Not found", status=404) diff --git a/examples/tornado_sample.py b/examples/tornado_sample.py index fef9db0..be32421 100644 --- a/examples/tornado_sample.py +++ b/examples/tornado_sample.py @@ -26,8 +26,9 @@ # Set up database and manager database = peewee_async.PooledPostgresqlDatabase('test') + # Define model -class TestNameModel(peewee.Model): +class TestNameModel(peewee_async.AioModel): name = peewee.CharField() class Meta: database = database @@ -35,6 +36,7 @@ class Meta: def __str__(self): return self.name + # Create table, add some instances TestNameModel.create_table(True) TestNameModel.get_or_create(id=1, defaults={'name': "TestNameModel id=1"}) @@ -45,7 +47,8 @@ def __str__(self): AsyncIOMainLoop().install() app = tornado.web.Application(debug=True) app.listen(port=8888) -app.objects = peewee_async.Manager(database) +app.database = database + # Add handlers class RootHandler(tornado.web.RequestHandler): @@ -56,7 +59,7 @@ class RootHandler(tornado.web.RequestHandler): """ async def post(self): name = self.get_argument('name') - obj = await self.application.objects.create(TestNameModel, name=name) + obj = await TestNameModel.aio_create(name=name) self.write({ 'id': obj.id, 'name': obj.name @@ -70,7 +73,7 @@ async def get(self): return try: - obj = await self.application.objects.get(TestNameModel, id=obj_id) + obj = await TestNameModel.aio_get(id=obj_id) self.write({ 'id': obj.id, 'name': obj.name, @@ -78,6 +81,7 @@ async def get(self): except TestNameModel.DoesNotExist: raise tornado.web.HTTPError(404, "Object not found!") + class CreateHandler(tornado.web.RequestHandler): async def get(self): loop = asyncio.get_event_loop() @@ -95,12 +99,13 @@ async def get(self): async def get_or_create(self): obj_id = self.get_argument('id', None) - async with self.application.objects.atomic(): - obj, created = await self.application.objects.get_or_create( - TestNameModel, id=obj_id, + async with self.application.database.aio_atomic(): + obj, created = await TestNameModel.aio_get_or_create( + id=obj_id, defaults={'name': "TestNameModel id=%s" % obj_id}) return obj + app.add_handlers('', [ (r"/", RootHandler), (r"/create", CreateHandler),