From 1c2ecbb89a7f1ce79f470f78a99af975de884c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 25 Mar 2019 22:17:31 +0400 Subject: [PATCH] :sparkles: Add docs and tests for encode/databases (#107) * :sparkles: Add docs and tests for encode/databases * :heavy_plus_sign: Add testing-only dependency, databases --- Pipfile | 1 + Pipfile.lock | 90 +++++++--- .../tutorial/async-sql-databases/image01.png | Bin 0 -> 70687 bytes docs/src/async_sql_databases/tutorial001.py | 65 +++++++ docs/tutorial/async-sql-databases.md | 160 ++++++++++++++++++ mkdocs.yml | 1 + pyproject.toml | 3 +- .../test_async_sql_databases/__init__.py | 0 .../test_tutorial001.py | 131 ++++++++++++++ 9 files changed, 431 insertions(+), 20 deletions(-) create mode 100644 docs/img/tutorial/async-sql-databases/image01.png create mode 100644 docs/src/async_sql_databases/tutorial001.py create mode 100644 docs/tutorial/async-sql-databases.md create mode 100644 tests/test_tutorial/test_async_sql_databases/__init__.py create mode 100644 tests/test_tutorial/test_async_sql_databases/test_tutorial001.py diff --git a/Pipfile b/Pipfile index 1fd9b869c..bb2af4ddd 100644 --- a/Pipfile +++ b/Pipfile @@ -27,6 +27,7 @@ uvicorn = "*" [packages] starlette = "==0.11.1" pydantic = "==0.21.0" +databases = {extras = ["sqlite"],version = "*"} [requires] python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index 839342b1b..1c100d1f2 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "676c6ae13691eef64abe6638f833cb8a330612521d3fad08718b240328b4877a" + "sha256": "24b3b7b88d3cbe671ddbe296e64c15f8558f0e5d5df977200119872a363aac13" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,37 @@ ] }, "default": { + "aiocontextvars": { + "hashes": [ + "sha256:1e0ff5837c8b01c36a1107acdd0baf7853ebdf6c9fc43e8e311f4be37ac2038a", + "sha256:6ff7aee14f549d52f0446cbb84d0deddcd3fc677bcf8fbc2ce13f5756d2064dc" + ], + "markers": "python_version < '3.7'", + "version": "==0.2.1" + }, + "aiosqlite": { + "hashes": [ + "sha256:af4fed9e778756fa0ffffc7a8b14c4d7b1a57155dc5669f18e45107313f6019e" + ], + "version": "==0.9.0" + }, + "contextvars": { + "hashes": [ + "sha256:2341042e1c03a271813e07dba29b6b60fa85c1005ea5ed1638a076cf50b4d625" + ], + "markers": "python_version < '3.7'", + "version": "==2.3" + }, + "databases": { + "extras": [ + "sqlite" + ], + "hashes": [ + "sha256:4a0f15669c390a04b439972426350c0ae921ddc08c42bd54f125eb2fb86ee728" + ], + "index": "pypi", + "version": "==0.2.0" + }, "dataclasses": { "hashes": [ "sha256:454a69d788c7fda44efd71e259be79577822f5e3f53f029a22d08004e951dc9f", @@ -24,6 +55,22 @@ "markers": "python_version < '3.7'", "version": "==0.6" }, + "immutables": { + "hashes": [ + "sha256:1e4f4513254ef11e0230a558ee0dcb4551b914993c330005d15338da595d3750", + "sha256:228e38dc7a810ba4ff88909908ac47f840e5dc6c4c0da6b25009c626a9ae771c", + "sha256:2ae88fbfe1d04f4e5859c924e97313edf70e72b4f19871bf329b96a67ede9ba0", + "sha256:2d32b61c222cba1dd11f0faff67c7fb6204ef1982454e1b5b001d4b79966ef17", + "sha256:35af186bfac5b62522fdf2cab11120d7b0547f405aa399b6a1e443cf5f5e318c", + "sha256:63023fa0cceedc62e0d1535cd4ca7a1f6df3120a6d8e5c34e89037402a6fd809", + "sha256:6bf5857f42a96331fd0929c357dc0b36a72f339f3b6acaf870b149c96b141f69", + "sha256:7bb1590024a032c7a57f79faf8c8ff5e91340662550d2980e0177f67e66e9c9c", + "sha256:7c090687d7e623d4eca22962635b5e1a1ee2d6f9a9aca2f3fb5a184a1ffef1f2", + "sha256:bc36a0a8749881eebd753f696b081bd51145e4d77291d671d2e2f622e5b65d2f", + "sha256:d9fc6a236018d99af6453ead945a6bb55f98d14b1801a2c229dd993edc753a00" + ], + "version": "==0.6" + }, "pydantic": { "hashes": [ "sha256:93fa585402e7c8c01623ea8af6ca23363e8b4c6a020b7a2de9e99fa29d642d50", @@ -32,6 +79,12 @@ "index": "pypi", "version": "==0.21.0" }, + "sqlalchemy": { + "hashes": [ + "sha256:781fb7b9d194ed3fc596b8f0dd4623ff160e3e825dd8c15472376a438c19598b" + ], + "version": "==1.3.1" + }, "starlette": { "hashes": [ "sha256:9d48b35d1fc7521d59ae53c421297ab3878d3c7cd4b75266d77f6c73cccb78bb" @@ -242,11 +295,11 @@ }, "ipython": { "hashes": [ - "sha256:06de667a9e406924f97781bda22d5d76bfb39762b678762d86a466e63f65dc39", - "sha256:5d3e020a6b5f29df037555e5c45ab1088d6a7cf3bd84f47e0ba501eeb0c3ec82" + "sha256:b038baa489c38f6d853a3cfc4c635b0cda66f2864d136fe8f40c1a6e334e2a6b", + "sha256:f5102c1cd67e399ec8ea66bcebe6e3968ea25a8977e53f012963e5affeb1fe38" ], "markers": "python_version >= '3.3'", - "version": "==7.3.0" + "version": "==7.4.0" }, "ipython-genutils": { "hashes": [ @@ -264,11 +317,11 @@ }, "isort": { "hashes": [ - "sha256:18c796c2cd35eb1a1d3f012a214a542790a1aed95e29768bdcb9f2197eccbd0b", - "sha256:96151fca2c6e736503981896495d344781b60d18bfda78dc11b290c6125ebdb6" + "sha256:08f8e3f0f0b7249e9fad7e5c41e2113aba44969798a26452ee790c06f155d4ec", + "sha256:4e9e9c4bd1acd66cf6c36973f29b031ec752cbfd991c69695e4e259f9a756927" ], "index": "pypi", - "version": "==4.3.15" + "version": "==4.3.16" }, "jedi": { "hashes": [ @@ -399,11 +452,11 @@ }, "mkdocs-material": { "hashes": [ - "sha256:762a71f82c1e291c3ff067cecd9d581557da777332fd98bc0af20fd5ab4a2dd0", - "sha256:b2c7174ecaa81fb1d62a5f4906f99fa0e7062ced8f9a14ec4f60b1bef9feebbf" + "sha256:0b394aa034b25a09a5874ae2a6ccc426fd81f5764e0991217b169e31cb0c1c0e", + "sha256:f5bb80a2c16d045d380edb2c5b05636af1bb709cb859bfaa9d01063a11df803f" ], "index": "pypi", - "version": "==4.0.2" + "version": "==4.1.0" }, "more-itertools": { "hashes": [ @@ -662,7 +715,6 @@ "hashes": [ "sha256:781fb7b9d194ed3fc596b8f0dd4623ff160e3e825dd8c15472376a438c19598b" ], - "index": "pypi", "version": "==1.3.1" }, "terminado": { @@ -688,15 +740,15 @@ }, "tornado": { "hashes": [ - "sha256:1a58f2d603476d5e462f7c28ca1dbb5ac7e51348b27a9cac849cdec3471101f8", - "sha256:33f93243cd46dd398e5d2bbdd75539564d1f13f25d704cfc7541db74066d6695", - "sha256:34e59401afcecf0381a28228daad8ed3275bcb726810654612d5e9c001f421b7", - "sha256:35817031611d2c296c69e5023ea1f9b5720be803e3bb119464bb2a0405d5cd70", - "sha256:666b335cef5cc2759c21b7394cff881f71559aaf7cb8c4458af5bb6cb7275b47", - "sha256:81203efb26debaaef7158187af45bc440796de9fb1df12a75b65fae11600a255", - "sha256:de274c65f45f6656c375cdf1759dbf0bc52902a1e999d12a35eb13020a641a53" + "sha256:1174dcb84d08887b55defb2cda1986faeeea715fff189ef3dc44cce99f5fca6b", + "sha256:2613fab506bd2aedb3722c8c64c17f8f74f4070afed6eea17f20b2115e445aec", + "sha256:44b82bc1146a24e5b9853d04c142576b4e8fa7a92f2e30bc364a85d1f75c4de2", + "sha256:457fcbee4df737d2defc181b9073758d73f54a6cfc1f280533ff48831b39f4a8", + "sha256:49603e1a6e24104961497ad0c07c799aec1caac7400a6762b687e74c8206677d", + "sha256:8c2f40b99a8153893793559919a355d7b74649a11e59f411b0b0a1793e160bc0", + "sha256:e1d897889c3b5a829426b7d52828fb37b28bc181cd598624e65c8be40ee3f7fa" ], - "version": "==6.0.1" + "version": "==6.0.2" }, "traitlets": { "hashes": [ diff --git a/docs/img/tutorial/async-sql-databases/image01.png b/docs/img/tutorial/async-sql-databases/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..01dc369a0b3c6b7390fb3ad6edda645e876a622b GIT binary patch literal 70687 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 literal 0 HcmV?d00001 diff --git a/docs/src/async_sql_databases/tutorial001.py b/docs/src/async_sql_databases/tutorial001.py new file mode 100644 index 000000000..cbf43d790 --- /dev/null +++ b/docs/src/async_sql_databases/tutorial001.py @@ -0,0 +1,65 @@ +from typing import List + +import databases +import sqlalchemy +from fastapi import FastAPI +from pydantic import BaseModel + +# SQLAlchemy specific code, as with any other app +DATABASE_URL = "sqlite:///./test.db" +# DATABASE_URL = "postgresql://user:password@postgresserver/db" + +database = databases.Database(DATABASE_URL) + +metadata = sqlalchemy.MetaData() + +notes = sqlalchemy.Table( + "notes", + metadata, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True), + sqlalchemy.Column("text", sqlalchemy.String), + sqlalchemy.Column("completed", sqlalchemy.Boolean), +) + + +engine = sqlalchemy.create_engine( + DATABASE_URL, connect_args={"check_same_thread": False} +) +metadata.create_all(engine) + + +class NoteIn(BaseModel): + text: str + completed: bool + + +class Note(BaseModel): + id: int + text: str + completed: bool + + +app = FastAPI() + + +@app.on_event("startup") +async def startup(): + await database.connect() + + +@app.on_event("shutdown") +async def shutdown(): + await database.disconnect() + + +@app.get("/notes/", response_model=List[Note]) +async def read_notes(): + query = notes.select() + return await database.fetch_all(query) + + +@app.post("/notes/", response_model=Note) +async def create_note(note: NoteIn): + query = notes.insert().values(text=note.text, completed=note.completed) + last_record_id = await database.execute(query) + return {**note.dict(), "id": last_record_id} diff --git a/docs/tutorial/async-sql-databases.md b/docs/tutorial/async-sql-databases.md new file mode 100644 index 000000000..4da640440 --- /dev/null +++ b/docs/tutorial/async-sql-databases.md @@ -0,0 +1,160 @@ +You can also use `encode/databases` with **FastAPI** to connect to databases using `async` and `await`. + +It is compatible with: + +* PostgreSQL +* MySQL +* SQLite + +In this example, we'll use **SQLite**, because it uses a single file and Python has integrated support. So, you can copy this example and run it as is. + +Later, for your production application, you might want to use a database server like **PostgreSQL**. + +!!! tip + You could adopt ideas from the previous section about SQLAlchemy ORM, like using utility functions to perform operations in the database, independent of your **FastAPI** code. + + This section doesn't apply those ideas, to be equivalent to the counterpart in Starlette. + +## Import and set up `SQLAlchemy` + +* Import `SQLAlchemy`. +* Create a `metadata` object. +* Create a table `notes` using the `metadata` object. + +```Python hl_lines="4 14 16 17 18 19 20 21 22" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! tip + Notice that all this code is pure SQLAlchemy Core. + + `databases` is not doing anything here yet. + +## Import and set up `databases` + +* Import `databases`. +* Create a `DATABASE_URL`. +* Create a `database` object. + +```Python hl_lines="3 9 12" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! tip + If you where connecting to a different database (e.g. PostgreSQL), you would need to change the `DATABASE_URL`. + +## Create the tables + +In this case, we are creating the tables in the same Python file, but in production, you would probably want to create them with Alembic, integrated with migrations, etc. + +Here, this section would run directly, right before starting your **FastAPI** application. + +* Create an `engine`. +* Create all the tables from the `metadata` object. + +```Python hl_lines="25 26 27 28" +{!./src/async_sql_databases/tutorial001.py!} +``` + +## Create models + +Create Pydantic models for: + +* Notes to be created (`NoteIn`). +* Notes to be returned (`Note`). + +```Python hl_lines="31 32 33 36 37 38 39" +{!./src/async_sql_databases/tutorial001.py!} +``` + +By creating these Pydantic models, the input data will be validated, serialized (converted), and annotated (documented). + +So, you will be able to see it all in the interactive API docs. + +## Connect and disconnect + +* Create your `FastAPI` application. +* Create event handlers to connect and disconnect from the database. + +```Python hl_lines="42 45 46 47 50 51 52" +{!./src/async_sql_databases/tutorial001.py!} +``` + +## Read notes + +Create the *path operation function* to read notes: + +```Python hl_lines="55 56 57 58" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! Note + Notice that as we communicate with the database using `await`, the *path operation function* is declared with `async`. + +### Notice the `response_model=List[Note]` + +It uses `typing.List`. + +That documents (and validates, serializes, filters) the output data, as a `list` of `Note`s. + +## Create notes + +Create the *path operation function* to create notes: + +```Python hl_lines="61 62 63 64 65" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! Note + Notice that as we communicate with the database using `await`, the *path operation function* is declared with `async`. + +### About `{**note.dict(), "id": last_record_id}` + +`note` is a Pydantic `Note` object. + +`note.dict()` returns a `dict` with its data, something like: + +```Python +{ + "text": "Some note", + "completed": False, +} +``` + +but it doesn't have the `id` field. + +So we create a new `dict`, that contains the key-value pairs from `note.dict()` with: + +```Python +{**note.dict()} +``` + +`**note.dict()` "unpacks" the key value pairs directly, so, `{**note.dict()}` would be, more or less, a copy of `note.dict()`. + +And then, we extend that copy `dict`, adding another key-value pair: `"id": last_record_id`: + +```Python +{**note.dict(), "id": last_record_id} +``` + +So, the final result returned would be something like: + +```Python +{ + "id": 1, + "text": "Some note", + "completed": False, +} +``` + +## Check it + +You can copy this code as is, and see the docs at http://127.0.0.1:8000/docs. + +There you can see all your API documented and interact with it: + + + +## More info + +You can read more about `encode/databases` at its GitHub page. diff --git a/mkdocs.yml b/mkdocs.yml index 1eed39a8c..f550d4867 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -57,6 +57,7 @@ nav: - OAuth2 with Password (and hashing), Bearer with JWT tokens: 'tutorial/security/oauth2-jwt.md' - Using the Request Directly: 'tutorial/using-request-directly.md' - SQL (Relational) Databases: 'tutorial/sql-databases.md' + - Async SQL (Relational) Databases: 'tutorial/async-sql-databases.md' - NoSQL (Distributed / Big Data) Databases: 'tutorial/nosql-databases.md' - Bigger Applications - Multiple Files: 'tutorial/bigger-applications.md' - Background Tasks: 'tutorial/background-tasks.md' diff --git a/pyproject.toml b/pyproject.toml index 54c28c22f..232009c89 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,8 @@ test = [ "isort", "requests", "email_validator", - "sqlalchemy" + "sqlalchemy", + "databases[sqlite]", ] doc = [ "mkdocs", diff --git a/tests/test_tutorial/test_async_sql_databases/__init__.py b/tests/test_tutorial/test_async_sql_databases/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py b/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py new file mode 100644 index 000000000..0293a6dfb --- /dev/null +++ b/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py @@ -0,0 +1,131 @@ +from starlette.testclient import TestClient + +from async_sql_databases.tutorial001 import app + +openapi_schema = { + "openapi": "3.0.2", + "info": {"title": "Fast API", "version": "0.1.0"}, + "paths": { + "/notes/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response_Read_Notes", + "type": "array", + "items": {"$ref": "#/components/schemas/Note"}, + } + } + }, + } + }, + "summary": "Read Notes Get", + "operationId": "read_notes_notes__get", + }, + "post": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/Note"} + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Create Note Post", + "operationId": "create_note_notes__post", + "requestBody": { + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/NoteIn"} + } + }, + "required": True, + }, + }, + } + }, + "components": { + "schemas": { + "NoteIn": { + "title": "NoteIn", + "required": ["text", "completed"], + "type": "object", + "properties": { + "text": {"title": "Text", "type": "string"}, + "completed": {"title": "Completed", "type": "boolean"}, + }, + }, + "Note": { + "title": "Note", + "required": ["id", "text", "completed"], + "type": "object", + "properties": { + "id": {"title": "Id", "type": "integer"}, + "text": {"title": "Text", "type": "string"}, + "completed": {"title": "Completed", "type": "boolean"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + } + }, +} + + +def test_openapi_schema(): + with TestClient(app) as client: + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + + +def test_create_read(): + with TestClient(app) as client: + note = {"text": "Foo bar", "completed": False} + response = client.post("/notes/", json=note) + assert response.status_code == 200 + data = response.json() + assert data["text"] == note["text"] + assert data["completed"] == note["completed"] + assert "id" in data + response = client.get(f"/notes/") + assert response.status_code == 200 + assert data in response.json()